Latest web development tutorials

スウィフトの継承

継承は、我々は別のクラスのメソッドとプロパティを取得するクラスとして理解することができます。

クラスが別のクラスから継承する場合、派生クラスは、サブクラス、スーパークラス(または親)と呼ばれる継承したクラスと呼ばれています

スウィフトでは、クラスは呼び出して、スーパークラスのメソッド、プロパティ、および添字スクリプトにアクセスし、それらをオーバーライドすることができます。

また、クラスのプロパティを継承したプロパティのオブザーバを追加することができます。


基底クラス

他のクラスは、基本クラス(基本クラス)を呼び出し、クラスを継承しません。

次の例では、我々は学生(stname)と全ての被験者のスコア(MARK1、MARK2、MARK3)について説明し、基本クラスのStudDetailsを定義します。

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 SomeClass: SomeSuperclass {
    // 类的定义
}

次の例では、我々はスーパーStudDetailsを定義し、その後、トムはそれを継承するサブクラス:

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

リライト(オーバーライド)

サブクラスは、我々は(オーバーライド)に書き換え、この動作を呼び出し、そのカスタマイズ機能を実現するためのインスタンスメソッド、クラスメソッド、インスタンス、プロパティ、または下付きのスクリプトを継承することができます。

私たちは、リライトを達成するために、overrideキーワードを使用することができます。

アクセススーパークラスのメソッド、プロパティ、および添字スクリプト

あなたは接頭辞スーパースーパークラス、プロパティまたは下付きのスクリプトにアクセスするために使用することができる方法。

リライト アクセス・メソッド、プロパティ、添字スクリプト
ウェイ super.somemethod()
プロパティ super.someProperty()
添字スクリプト スーパー[someIndex]

メソッドとプロパティのオーバーライド

メソッドのオーバーライド

私たちのサブクラスでは、スーパークラスのメソッドをオーバーライドするためにoverrideキーワードを使用することができます。

以下の例では、我々は、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)を提供することができます。

サブクラスが継承されたプロパティは、計算の記憶タイプまたはタイプである知っていない、それだけで継承されたプロパティは、名前と型を持つことになります知っています。 ですから、プロパティを書き換え、それがダウンして書かれた名前とタイプする必要があります。

注意事項:

  • プロパティを書き換えるにセッターを提供した場合は、ゲッターを提供する必要があります。

  • あなたが継承されたプロパティ値を変更するにゲッター書き換えられたバージョンを必要としない場合は、somePropertyあなたがプロパティをオーバーライドする名前ですsuper.someProperty、によって継承された値に戻すことができます。

私たちはスーパーサークルと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)")

上記プログラム実行出力は、次のとおりです。

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

オーバーライドプロパティビューア

あなたはリライトで観察されたプロパティでプロパティを継承するプロパティを追加することができます。 ときに継承されたプロパティの値が変更された結果として、あなたは監視されます。

注:継承された型のプロパティのオブザーバを追加することはできません定数メモリまたは読み取り専用の計算継承されたプロパティを属性。

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クラス)が、最終的なマークされる前に、クラスを継承することはできませんので、そうでなければコンパイルエラーが報告され、最終的に追加することができます。

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