มรดกสวิฟท์
มรดกสามารถเข้าใจได้เป็นระดับที่เราได้รับวิธีการและคุณสมบัติของชั้นอื่นใช้
เมื่อชั้นเรียนสืบทอดมาจากชั้นอื่นที่เรียนมาจะเรียกว่าเป็น subclass ชั้นที่สืบทอดมาเรียก superclass (หรือผู้ปกครอง)
สวิฟท์ในชั้นเรียนสามารถเรียกและการเข้าถึงวิธี superclass ของคุณสมบัติและสคริปต์ห้อยและสามารถแทนที่พวกเขา
นอกจากนี้เรายังสามารถเพิ่มคุณสมบัติสังเกตการณ์คุณสมบัติที่สืบทอดมาเรียน
ชั้นฐาน
ไม่มีชั้นเรียนอื่น ๆ รับช่วงชั้นโทรชั้นฐาน (base class)
ตัวอย่างต่อไปนี้เรากำหนด StudDetails ชั้นฐานอธิบายนักเรียน (stname) และทุกวิชาคะแนน (mark1, Mark2, mark3):
class StudDetails { var stname: String! var mark1: Int! var mark2: Int! var mark3: Int! init(stname: String, mark1: Int, mark2: Int, mark3: Int) { self.stname = stname self.mark1 = mark1 self.mark2 = mark2 self.mark3 = mark3 } } let stname = "swift" let mark1 = 98 let mark2 = 89 let mark3 = 76 print(stname) print(mark1) print(mark2) print(mark3)
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
swift 98 89 76
swift 98 89 76
ประเภทรอง
หมายถึงประเภทรองคือการสร้างคลาสใหม่บนพื้นฐานของ class ที่มีอยู่
เพื่อระบุ superclass ของชั้นที่ชื่อชั้นซุปเปอร์เขียนที่ด้านหลังของชื่อประเภทรอง (:) ลำไส้ใหญ่แยกไวยากรณ์เป็นดังนี้
class SomeClass: SomeSuperclass { // 类的定义 }
ตัวอย่าง
ตัวอย่างต่อไปนี้เรากำหนด StudDetails superclass แล้วซับคลาสทอมมรดก:
class StudDetails { var mark1: Int; var mark2: Int; init(stm1:Int, results stm2:Int) { mark1 = stm1; mark2 = stm2; } func show() { print("Mark1:\(self.mark1), Mark2:\(self.mark2)") } } class Tom : StudDetails { init() { super.init(stm1: 93, results: 89) } } let tom = Tom() tom.show()
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
Mark1:93, Mark2:89
Rewrite (แทนที่)
subclass สามารถสืบทอดวิธีเช่นวิธีการเรียนอินสแตนซ์ทรัพย์สินหรือสคริปต์ห้อยที่จะตระหนักถึงความสามารถในการปรับแต่งของพวกเขาที่เราเรียกพฤติกรรมนี้เขียนใหม่ (ที่สำคัญ)
เราสามารถใช้คำแทนที่เพื่อให้บรรลุเขียน
การเข้าถึงวิธี superclass คุณสมบัติและสคริปต์ห้อย
วิธีการที่คุณสามารถใช้เพื่อเข้าถึงคำนำหน้าชั้นซุปเปอร์ซุปเปอร์ทรัพย์สินหรือสคริปต์ห้อย
เขียนใหม่ | วิธีการเข้าถึงคุณสมบัติสคริปต์ห้อย |
---|---|
ทาง | super.somemethod () |
คุณสมบัติ | super.someProperty () |
สคริปต์ห้อย | ซุปเปอร์ [someIndex] |
วิธีการเอาชนะและคุณสมบัติ
วิธีการเอาชนะ
ในชั้นย่อยของเราเราสามารถใช้คำแทนที่เพื่อแทนที่วิธี superclass
ตัวอย่างต่อไปนี้เราเขียน Show () วิธีการ:
class SuperClass { func show() { print("这是超类 SuperClass") } } class SubClass: SuperClass { override func show() { print("这是子类 SubClass") } } let superClass = SuperClass() superClass.show() let subClass = SubClass() subClass.show()
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
这是超类 SuperClass 这是子类 SubClass
คุณสมบัติที่สำคัญ
คุณสามารถให้ความทะเยอทะยานที่กำหนดเอง (หรือ Setter) เขียนคุณสมบัติได้รับมรดกใด ๆ ไม่ว่าจะเป็นทรัพย์สินที่ได้รับมรดกเป็นชนิดหรือประเภทการจัดเก็บข้อมูลการประมวลผลของทรัพย์สิน
subclass ไม่ทราบคุณสมบัติสืบทอดเป็นประเภทการจัดเก็บหรือประเภทของการคำนวณก็เท่านั้นที่รู้ว่าคุณสมบัติที่ได้รับการถ่ายทอดจะมีชื่อและประเภท เพื่อให้คุณเขียนสถานที่ให้บริการมีความจำเป็นต้องชื่อและประเภทเขียนลง
ข้อควรระวัง:
ถ้าคุณให้ Setter ในการเขียนคุณสมบัติแล้วคุณจะต้องให้ความทะเยอทะยาน
หากคุณไม่ต้องการที่ทะเยอทะยานเขียนรุ่นในการปรับเปลี่ยนค่าทรัพย์สินมรดกคุณสามารถกลับไปค่าที่สืบเชื้อสายมาจาก super.someProperty ที่ someProperty เป็นชื่อที่คุณต้องการแทนที่ทรัพย์สิน
ตัวอย่างต่อไปนี้เรากำหนด subclass ของ superclass วงกลมและสี่เหลี่ยมเราเขียนบริเวณโรงแรมชั้นสี่เหลี่ยมผืนผ้า:
class Circle { var radius = 12.5 var area: String { return "矩形半径 \(radius) " } } // 继承超类 Circle class Rectangle: Circle { var print = 7 override var area: String { return super.area + " ,但现在被重写为 \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 print("Radius \(rect.area)")
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
Radius 矩形半径 25.0 ,但现在被重写为 3
เอาชนะคุณสมบัติ Viewer
คุณสามารถเพิ่มคุณสมบัติที่จะได้รับมรดกทรัพย์สินในคุณสมบัติของการปฏิบัติในการเขียน เป็นผลให้เมื่อมีการเปลี่ยนแปลงมูลค่าทรัพย์สินที่สืบทอดมาคุณจะได้รับการตรวจสอบ
หมายเหตุ: คุณไม่สามารถเพิ่มคุณสมบัติสังเกตการณ์สำหรับแอตทริบิวต์ประเภทคงที่ได้รับมรดกหรือหน่วยความจำอ่านอย่างเดียวคุณสมบัติที่สืบทอดมาคำนวณ
class Circle { var radius = 12.5 var area: String { return "矩形半径为 \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + " ,但现在被重写为 \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 print("半径: \(rect.area)") class Square: Rectangle { override var radius: Double { didSet { print = Int(radius/5.0)+1 } } } let sq = Square() sq.radius = 100.0 print("半径: \(sq.area)")
半径: 矩形半径为 25.0 ,但现在被重写为 3 半径: 矩形半径为 100.0 ,但现在被重写为 21
ป้องกันการเขียน
เราสามารถใช้คำสุดท้ายป้องกันพวกเขาจากการถูกเขียนทับ
หากคุณแทนที่วิธีสุดท้ายทรัพย์สินหรือสคริปต์ห้อยที่ข้อผิดพลาดเวลารวบรวม
คุณสามารถเพิ่มรอบสุดท้ายก่อนที่ชั้นคำหลักลักษณะ (ชั้นสุดท้าย) ไปทั้งชั้นสุดท้ายจะถูกทำเครื่องหมายเพื่อให้ชั้นเรียนไม่สามารถสืบทอดมิฉะนั้นข้อผิดพลาดสะสมจะมีการรายงาน
final class Circle { final var radius = 12.5 var area: String { return "矩形半径为 \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + " ,但现在被重写为 \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 print("半径: \(rect.area)") class Square: Rectangle { override var radius: Double { didSet { print = Int(radius/5.0)+1 } } } let sq = Square() sq.radius = 100.0 print("半径: \(sq.area)")
เนื่องจากตัวอย่างข้างต้นใช้คำสำคัญสุดท้ายคือการไม่ได้รับอนุญาตที่จะเขียนเพื่อให้การดำเนินการจะได้รับ:
error: var overrides a 'final' var override var area: String { ^ note: overridden declaration is here var area: String { ^ error: var overrides a 'final' var override var radius: Double { ^ note: overridden declaration is here final var radius = 12.5 ^ error: inheritance from a final class 'Circle' class Rectangle: Circle { ^