2016-12-24 6 views
3

Swift's documentationから:Swiftでイニシャライザをオーバーライドするのはなぜですか?

のObjective-Cでサブクラスとは異なり、スウィフトサブクラスはデフォルトで そのスーパークラスの初期化子を継承しません。

しかし、それは言う:あなたはスーパークラス 指定イニシャライザと一致するサブクラスの初期化子を書くとき

は、あなたが効果的に初期化子を指定 のオーバーライドを提供しています。したがって、オーバーライド 修飾子をサブクラスの初期化子定義の前に記述する必要があります。

コンストラクタが継承されていないJavaの背景から来ていますが、これはどのように正確に動作するのか分かりません。デフォルトで継承されないイニシャライザをオーバーライドするのはなぜですか?私はコンストラクタのように思えますが、初期化子は暗黙的にクラス自体の名前を付けられ、サブクラスでオーバーロードされます(たとえば、JavaのクラスDogはコンストラクタの名前がDogのみです)。しかし、私は親の初期化子をオーバーライドするこの考えを理解していません。

答えて

0

サブクラスは "デフォルトで"スーパークラスの初期化子を継承しないかもしれませんが、継承することができます(例えば、指定された初期化子を指定しないと、スーパークラスの指定された初期化子をすべて継承します... Automatic Initializer Inheritance )。

Chihuahuaと呼ばれる Dogサブクラスを考えてみましょう:あなたは Chihuahua内の任意の指定された初期化子を実装していない場合は、自動的にあなたの部分の余分なコードで Dog初期化子を継承します。しかし何らかの理由でそれを上書きする必要がある場合は、指定したイニシャライザ Chihuahuaから指定されたイニシャライザ Dogに電話するだけで済みます。 Chihuahua初期設定子に Dog指定初期化子と同じ署名がある場合は、 overrideキーワードを明示的に指定する必要があります。

+0

ああ、これは非常に意味がある、ありがとう!オーバーライドは、イニシャライザがスーパークラスから継承されている場合にのみ適用できます。 – rb612

+0

はい、もっと正確であることが必要です[https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/ uid/TP40014097-CH18-NoLink_137)、 "オーバーライドされたプロパティ、メソッド、または添え字と同様に、' override'修飾子があるとSwiftはスーパークラスに指定された一致する初期化子がオーバーライドされていることを確認し、あなたの上書きイニシャライザが意図したとおりに指定されています。 – Rob

関連する問題