2016-02-16 16 views
5

基本クラスから継承するクラスがいくつかあります。通常、私は子供の中でコンストラクタを書き直して親のものを呼び出すためにC++クラスを使用しました。Swiftのinitサブクラスを呼び出すときに親コンストラクタを呼び出す

再作成せずにサブクラスを初期化するときに、Swiftで親コンストラクタを呼び出す方法はありますか?一例として、これら2つのクラスを持つ

internal class A { 
    init(aBool: Bool? = false) { 
     ... 
    } 
} 

class B: A { 
    init(aString: String) { 
     ... 
    } 
} 

、私はコンストラクタを使用してBを初期化したいと思います:

let obj = A(true) 

答えて

7

The rules from Apple状態それ:

[S] ubclassesは、デフォルトではそのスーパークラス初期化子を継承しません。ただし、特定の条件が満たされると、スーパークラスの初期化子が自動的に継承されます。実際には、多くの一般的なシナリオでイニシャライザのオーバーライドを記述する必要はなく、スーパークラスのイニシャライザを安全なときに最小限の労力で継承できます。

あなたはサブクラスで紹介するすべての新しいプロパティのデフォルト値を提供すると仮定すると、次の2つの規則が適用されます。

ルール1: をあなたのサブクラスが任意の指定された初期化子を定義していない場合は、自動的にすべてを継承しますそのスーパークラスは初期化子を指定します。

ルール2: サブクラスがスーパークラス指定イニシャライザ(ルール1に従って継承するか、カスタム定義をその定義の一部として提供するか)の実装を提供する場合、自動的にすべてのスーパークラスの便利な初期化子。

これらのルールは、サブクラスがさらに便利な初期化子を追加した場合でも適用されます。

どういう意味ですか?あなたのサブクラスBの初期化子を便利な初期化子にする場合、BAの指定された初期化子のすべてを継承する必要があります。

class B: A { 
    convenience init(aString: String) { ... } 
} 
2

あなたはB年代はconvenience initを初期化させる場合には、元initをマスクしないであろうと、あなたはこれを行うことができるでしょう...

class A { 
    var b: Bool? = nil 
    init(aBool: Bool? = false) { 
     self.b = aBool 
    } 
} 

class B: A { 
    var s: String? = nil 
    convenience init(aString: String) { 
     self.init(aBool: false) 
     self.s = aString 
    } 
} 

let obj1 = A(aBool: true) // obj1 is now an A, obviously. 
let obj2 = B(aBool: true) // obj2 is now a B 

あなたはデフォルトにするか、そうでなければすべてのプロパティを設定する必要があります...

overrideオリジナルのinitBにして、単にsuper.initと呼んでもかまいません。

関連する問題