2017-03-04 12 views
2

ルール1スウィフト初期化ルールの混乱

は、それが自動的に、そのスーパークラスの指定イニシャライザのすべてを継承します。

混乱:サブクラスに1つの指定された初期化子を提供しました。つまり、スーパークラス指定のイニシャライザはサブクラス化されません。しかし、を書き換えてキーワードを指定する必要があります。これはサブクラスで指定されたスーパークラスの初期化子を実装するためです(スーパークラスはinitがサブクラスになるという意味です)。ルール1は、私がサブクラス指定のイニシャライザを提供した場合、指定されたスーパークラスはダウンしないと言います。 (私たちは、サブクラスのいずれかの指定された初期化を提供しなかった場合は理にかなっているだけオーバーライドします。)

class Food{ 
    var name : String 
    init(foodName :String) { 
     self.name = foodName 
    } 
} 

class RecipieIngredient : Food{ 
    var quantity : Int 
    init(fName :String, quantity :Int) { 
     self.quantity = quantity 
     super.init(foodName: fName) 
    } 

    override convenience init (foodName :String){ 
     self.init(fName: foodName, quantity: 1) 
    } 
} 
+0

あなたが指しているスーパークラスとサブクラスの例を教えてください。あなたが何を求めているのかははっきりとは分かりません。 –

+0

質問するコードを追加しました。 @SørenMortensen –

答えて

-2

のinit()が保護された方法ではありませんので、それはです。したがって、サブクラスでinit()メソッドを定義すると、コンパイラはスーパークラスのinit()メソッドかサブクラスかを認識しません。 '上書き'はこれをクリアします。

+0

「保護された方法」とはどういう意味ですか? Swiftには「保護された」アクセスレベルはありません。 'override'キーワードはメソッドをあいまいにするものではありません。オーバーライドを提供していることを明示的に指定するだけで、コンパイラはスーパークラスに一致する宣言があることを確認できます。 – Hamish

+0

あなたはそうです。私はSwiftに似たようなキーワードがないので、「保護された」という言葉を使いました。曖昧さ回避に関しては、そうです。同じシグネチャのメソッドを宣言するサブクラスを持つスーパークラスを作成してみてください。 – dylanthelion

+0

あいまいさがないので、曖昧さ回避はありません。コールが動的にディスパッチされる場合、クラスのvtableは、正しい実装を検索するために実行時に使用されます。呼び出しが静的にディスパッチされる場合、コンパイラは型の宣言を調べてディスパッチ先の実装を見つけます。 – Hamish

関連する問題