Latest web development tutorials

Swift Dziedziczenie

Dziedziczenie może być rozumiane jako klasy otrzymujemy metod i właściwości innej klasy.

Kiedy klasa dziedziczy z innej klasy, klasa pochodna jest nazywana podklasą, dziedziczonej klasy o nazwie nadklasą (lub rodzic)

W Swift, zajęcia można zadzwonić i uzyskać dostęp do metod, właściwości i skrypt indeksu dolnego nadklasy, a mogą je zastąpić.

Możemy również dodać właściwości obserwatora dziedziczonej właściwości dla klasy.


Klasa bazowa

Żadne inne zajęcia dziedziczyć klasy, zadzwoń do klasy podstawowej (klasa podstawowa).

Poniższy przykład, możemy zdefiniować StudDetails klasy bazowej, opisuje studenta (stname) oraz wyniki wszystkich przedmiotów (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)

Wyjście powyżej wykonywanie programu jest:

swift
98
89
76
swift
98
89
76

podklasa

Odnosi się do podklasy jest stworzenie nowej klasy na podstawie istniejącego typu.

Aby określić nadklasą klasy, super nazwa klasy na odwrocie nazwy podklasy (:) składni okrężnicy oddziela się następująco

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

Przykłady

Poniższy przykład, definiujemy nadklasą StudDetails, a następnie podklasy Tom dziedziczą go:

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

Wyjście powyżej wykonywanie programu jest:

Mark1:93, Mark2:89

Przepisz (Nadrzędny)

Podklasa może być dziedziczone metody instancji, metody klasy, przykład nieruchomości lub skryptu indeks dolny realizować swoje możliwości dostosowania, nazywamy to zachowanie przepisany (nadrzędny).

Możemy użyć słowa kluczowego override do osiągnięcia przepisać.

Dostęp do metody nadklasy, właściwości i skrypt indeks

Metodę można użyć, aby uzyskać dostęp do prefiksu Super super klasy, mienia lub dolnym skrypt.

przepisać metody dostępu, właściwości, skrypty indeksie dolnym
sposób super.somemethod ()
nieruchomość super.someProperty ()
skrypt indeks Super [someIndex]

Zastępowanie metod i właściwości

metody nadrzędne

W naszej podklasy, możemy użyć słowa kluczowego override, aby zastąpić metodę klasy nadrzędnej.

Poniższe przykłady, przepisujemy metody 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()

Wyjście powyżej wykonywanie programu jest:

这是超类 SuperClass
这是子类 SubClass

Właściwości nadrzędne

Można podać niestandardową getter (lub setter) przepisać żadnego odziedziczonej nieruchomości, czy właściwość jest dziedziczona z typem przechowywania lub typu komputerowego mienia.

Podklasa nie wie dziedziczonej właściwości jest typem przechowywania lub rodzaj obliczeń, to wie tylko odziedziczyła nieruchomość będzie mieć nazwę i typ. Więc przepisać nieruchomości, konieczne jest nazwa i typ spisane.

Środki ostrożności:

  • Jeśli podasz w setter właściwości poprawiania, a następnie należy podać getter.

  • Jeśli nie chcesz getter przepisany wersji gdzie zmodyfikować odziedziczone wartości nieruchomości, można powrócić do wartości odziedziczonych przez super.someProperty, gdzie someProperty jest nazwą chcesz nadpisać właściwość.

Poniższy przykład możemy zdefiniować podklasę superklasy Circle i prostokąt, możemy przepisać obszar właściwości klasy 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)")

Wyjście powyżej wykonywanie programu jest:

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

Nadrzędnym Właściwości Viewer

Możesz dodać obiekt do dziedziczenia własności we właściwościach obserwowanych w przepisać. W rezultacie, gdy dziedziczne zmiany wartości nieruchomości, będzie monitorowany.

Uwaga: Nie można dodać właściwości obserwatora na odziedziczonej typu atrybutu pamięci stałe lub tylko do odczytu obliczeniowa odziedziczonej nieruchomości.

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

Zapobiegać przepisanie

Możemy użyć ostateczna kluczowe uniemożliwiają jej nadpisane.

Jeśli zastąpić ostateczną metodę, właściwość lub skrypt indeks dolny, w czasie kompilacji błędu czasowego.

Możesz dodać ostateczna przed klasa kluczowe charakterystyczne (final class) do całej klasy jest oznaczona wersja ostateczna, więc klasa nie może być dziedziczone, w przeciwnym razie błędów kompilacji będą zgłaszane.

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

W związku z powyższym przykładzie wykorzystuje ostateczne słowo kluczowe nie może przepisać, więc wykonanie będą miały:

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