Pusaka pantas
Warisan boleh difahami sebagai satu kelas memperoleh kaedah dan atribut kelas lain.
Apabila kelas mewarisi kelas lain, kelas mewarisi dipanggil subkelas, dan kelas yang diwarisi dipanggil kelas super (atau kelas induk)
Dalam Swift, kelas boleh memanggil dan mengakses kaedah superclass , atribut dan skrip subskrip, dan ia boleh ditindih.
Kami juga boleh menambah pemerhati harta untuk harta warisan dalam kelas.
Kelas Asas
Kelas yang tidak mewarisi kelas lain dipanggil Kelas Asas.
Dalam contoh berikut, kami mentakrifkan kelas asas StudDetails, menerangkan pelajar (stname) dan markah (mark1, markah2, markah3) bagi setiap subjek:
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)
Hasil output bagi pelaksanaan program di atas ialah :
swift 98 89 76
swift 98 89 76
Subkelas
Subkelas merujuk kepada mencipta kelas baharu berdasarkan kelas sedia ada.
Untuk menunjukkan superclass kelas tertentu, tulis nama superclass selepas nama subclass, dipisahkan dengan titik bertindih (:) Format sintaks adalah seperti berikut
class SomeClass: SomeSuperclass { // 类的定义 }
Contoh<🎜. >
Dalam contoh berikut, kami mentakrifkan kelas super StudDetails, dan kemudian menggunakan subkelas Tom untuk mewarisinya: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()Hasil keluaran pelaksanaan program di atas ialah:
Mark1:93, Mark2:89< .
Kita boleh menggunakan kata kunci ganti untuk melaksanakan penulisan semula. Akses kaedah kelas super, sifat dan subskrip Anda boleh mengakses kaedah kelas super, sifat atau subskrip dengan menggunakan awalan super.
Timpa kaedah dan sifat
Timpa kaedah
Dalam subkelas kami, kami boleh menggunakan kata kunci timpa untuk mengatasi kaedah kelas super.
Dalam contoh berikut, kami telah menulis semula kaedah 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()
Hasil keluaran pelaksanaan program di atas ialah:
这是超类 SuperClass 这是子类 SubClass
Tulis semula atribut
Anda boleh Menyediakan getter tersuai (atau setter) untuk mengatasi mana-mana harta warisan, sama ada harta warisan disimpan atau dikira.
Subkelas tidak mengetahui sama ada atribut yang diwarisi disimpan atau dikira. Ia hanya mengetahui bahawa atribut yang diwarisi akan mempunyai nama dan jenis. Jadi apabila anda mengatasi atribut, anda mesti menulis nama dan jenisnya.
Nota:
Jika anda menyediakan setter dalam harta yang diganti, anda juga mesti menyediakan getter.
Jika anda tidak mahu mengubah suai nilai sifat yang diwarisi dalam pengambil dalam versi yang diganti, anda boleh terus mengembalikan nilai yang diwarisi melalui super.someProperty, dengan someProperty ialah nilai yang anda nak penting Tulis nama harta.
Dalam contoh berikut, kami mentakrifkan kelas super Bulatan dan Subkelas Segiempat Dalam kelas Rectangle, kami mengatasi kawasan atribut:
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)")
Hasil keluaran. pelaksanaan program di atas ialah:
Radius 矩形半径 25.0 ,但现在被重写为 3
Mengatasi pemerhati harta
Anda boleh menambah pemerhati harta untuk harta yang diwarisi dalam menimpa harta. Dengan cara ini, anda akan mengesan apabila nilai harta yang diwarisi berubah.
Nota: Anda tidak boleh menambah pemerhati sifat untuk sifat tersimpan malar yang diwarisi atau sifat dikira baca sahaja yang diwarisi.
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)")rrree
Halang penulisan semula
Kita boleh menggunakan kata kunci terakhir untuk mengelakkannya daripada ditindih.
Jika anda mengatasi kaedah akhir, atribut atau skrip subskrip, ralat akan dilaporkan semasa penyusunan.
Anda boleh menandai keseluruhan kelas sebagai muktamad dengan menambahkan atribut akhir (kelas akhir) sebelum kelas kata kunci sedemikian tidak boleh diwarisi, jika tidak, ralat kompilasi akan dilaporkan.
半径: 矩形半径为 25.0 ,但现在被重写为 3 半径: 矩形半径为 100.0 ,但现在被重写为 21
Memandangkan contoh di atas menggunakan kata kunci akhir dan tidak membenarkan penulisan semula, pelaksanaan akan melaporkan ralat:
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)")