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)")