Latest web development tutorials

Warisan Swift

Warisan dapat dipahami sebagai kelas kita mendapatkan metode dan properti dari kelas lain.

Ketika kelas mewarisi dari kelas lain, kelas turunan disebut subclass, kelas mewarisi disebut superclass (atau orangtua)

Dalam Swift, kelas dapat memanggil dan mengakses metode, properti, dan script subscript superclass, dan dapat menimpa mereka.

Kami juga dapat menambahkan properti pengamat mewarisi properti untuk kelas.


kelas dasar

Tidak ada kelas-kelas lain mewarisi kelas, panggilan kelas dasar (Base Class).

Contoh berikut, kita mendefinisikan StudDetails kelas dasar, menjelaskan siswa (stname) dan semua nilai mata pelajaran (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)

Output di atas eksekusi program adalah:

swift
98
89
76
swift
98
89
76

subclass

Mengacu subclass adalah untuk menciptakan sebuah kelas baru berdasarkan kelas yang ada.

Untuk menentukan superclass kelas, nama kelas super ditulis di belakang nama subclass, (:) dipisahkan oleh titik dua sintaks sebagai berikut

class SomeClass: SomeSuperclass {
    // 类的定义
}

contoh

Contoh berikut, kita mendefinisikan StudDetails superclass, maka subclass Tom 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()

Output di atas eksekusi program adalah:

Mark1:93, Mark2:89

Rewrite (Melebihi)

Subclass dapat mewarisi metode instan, metode kelas, misalnya, properti, atau script subscript untuk mewujudkan kemampuan kustomisasi mereka, kita sebut perilaku ini ditulis ulang (override).

Kita dapat menggunakan kata kunci override untuk mencapai menulis ulang.

metode akses superclass, sifat, dan script subscript

Metode yang dapat Anda gunakan untuk mengakses awalan kelas super super, properti atau script subscript.

menulis kembali metode akses, sifat, naskah subscript
cara super.somemethod ()
milik super.someProperty ()
Script subscript Super [someIndex]

metode utama dan properti

metode utama

Di sub-class, kita dapat menggunakan kata kunci override untuk mengganti metode superclass.

Contoh-contoh berikut, kita menulis ulang acara () metode:

class SuperClass {
    func show() {
        print("这是超类 SuperClass")
    }
}

class SubClass: SuperClass  {
    override func show() {
        print("这是子类 SubClass")
    }
}

let superClass = SuperClass()
superClass.show()

let subClass = SubClass()
subClass.show()

Output di atas eksekusi program adalah:

这是超类 SuperClass
这是子类 SubClass

Properti utama

Anda dapat memberikan pengambil kustom (atau setter) untuk menulis ulang setiap harta warisan, apakah properti diwariskan ke jenis penyimpanan atau jenis komputasi properti.

Subclass tidak tahu harta warisan adalah jenis penyimpanan atau jenis perhitungan, hanya yang tahu harta warisan akan memiliki nama dan jenis. Jadi Anda menulis ulang properti, perlu untuk mengetik nama dan ditulis.

kewaspadaan:

  • Jika Anda memberikan setter dalam menulis ulang properti, maka Anda harus memberikan getter.

  • Jika Anda tidak ingin getter ditulis ulang versi dalam memodifikasi nilai harta warisan, Anda dapat kembali ke nilai-nilai yang diwariskan oleh super.someProperty, di mana someProperty adalah nama yang Anda ingin menimpa properti.

mengikuti contoh kita mendefinisikan subclass dari superclass Circle dan Rectangle, kami menulis ulang area properti kelas Rectangle:

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

Output di atas eksekusi program adalah:

Radius 矩形半径 25.0  ,但现在被重写为 3

Utama Properti Viewer

Anda dapat menambahkan properti untuk mewarisi properti di properti diamati dalam menulis ulang. Akibatnya, ketika perubahan nilai properti warisan, Anda akan dipantau.

Catatan: Anda tidak dapat menambahkan properti pengamat untuk jenis mewarisi atribut konstanta memori atau read-only komputasi mewarisi properti.

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

Mencegah rewrite

Kita dapat menggunakan kata kunci akhir mencegah mereka dari yang ditimpa.

Jika Anda mengganti metode akhir, properti, atau script subscript, pada error waktu kompilasi.

Anda dapat menambahkan final sebelum kelas kata kunci karakteristik (kelas akhir) untuk seluruh kelas ditandai akhir, sehingga kelas tidak dapat diwariskan, jika kesalahan kompilasi akan dilaporkan.

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

Karena contoh di atas menggunakan kata kunci akhir tidak diperbolehkan untuk menulis ulang, sehingga eksekusi akan diberikan:

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 {
      ^