3

次のことはできますか?

1) 指定されていない初期化子がスーパークラスの指定された初期化子を呼び出します
2) クラスの指定された初期化子がスーパークラスの指定されていない初期化子を呼び出しますか?

または、フローは次のようにする必要があります。

a) 指定イニシャライザはスーパークラスの指定イニシャライザを呼び出さなければならない
b) 非指定イニシャライザは自身のクラスの指定イニシャライザを呼び出さなければならない

上記の(1)または(2)に違反した場合、どうなりますか? (または、常に (a) と (b) に従わなければならない場合、その背後にある理由は何ですか?)

4

3 に答える 3

3
  • 1:いいえ。
  • 2: はい。
  • a: 議論の余地があります。
  • b: はい。

指定された初期化子のポイントは、手元のオブジェクトを適切に設定する方法を知っているのは初期化子であるということです。クラス内の他のすべての初期化子は、指定された初期化子を呼び出す必要があります。そうでない場合、オブジェクトが正しく初期化されていない可能性があります。

Apple の Cocoa ドキュメントでは、複数の初期化子を処理する方法について説明しており、次の内容が含まれています。

通常、初期化パラメーターを完全に補完するクラスの初期化子は、指定された初期化子です。サブクラスの指定された初期化子は、メッセージをスーパーに送信することによって、そのスーパークラスの指定された初期化子を呼び出す必要があります。

これは少しあいまいです。サブクラスの指定された初期化子は、そのスーパークラスの指定された初期化子を呼び出さなければならないように思えます。しかし、それが本意ではないと思います。ここで重要なのは、指定されたイニシャライザが責任を持って、 にメッセージを送信してスーパークラスが適切に初期化されていることを確認することsuperです。の指定されていないイニシャライザの1 つを呼び出すことによってそれをsuper行った場合、そのイニシャライザが最終的に指定されたイニシャライザを呼び出すことを条件として、それは問題ありません。そのため、(2)は問題ないと思います。

さらに読むと、次のようになります。

init を含めることができる便利な (または二次的な) 初期化子は、super を呼び出しません。

したがって、ここで彼らが言っているのは、指定されたイニシャライザと他のイニシャライザとの重要な違いは、指定されたイニシャライザが に初期化メッセージを送信する唯一のイニシャライザであるということsuperです。

(1) に戻ると、 を呼び出す「指定されて[super init]いない」初期化子がある場合、それは実際には指定されていない初期化子ではありません。あなたのメソッドは、初期化メッセージを に送信することにより、指定されたイニシャライザの責任を負いますsuper。それは必ずしも問題ではありません.UIViewには2つの指定された初期化子があることに注意してください.

于 2012-09-24T06:42:51.623 に答える
2

指定された初期化子を作成することは形式的ではないため、規則に違反するかどうかはあなた次第です。

複数の初期化子を持つクラスの一般的な方法は、最も多くの引数を受け入れるものを指定された初期化子にし、他のすべての初期化子がそれを呼び出せるようにすることです。指定されたイニシャライザのみが、同じ規則に従うスーパークラスの指定されたイニシャライザを呼び出すことができます。

他の人があなたのクラスをサブクラス化し、指定された初期化子を呼び出す場合、すべてのインスタンス変数が正しく初期化されていることを確認できます。クラスがこれらの一般的な慣行に従っていない場合、最初は自分用に乱雑なクラスを作成しても、他の人にとってはさらに使いにくくなる可能性があります。

于 2012-09-24T06:46:32.887 に答える
-1

次のことはできますか?

1) 指定されていない初期化子がスーパークラスの指定された初期化子を呼び出す

サブクラスの実装者として、スーパークラスの指定されたイニシャライザー内にあるコードを知り、コードをポーズせずに自分で実装する方法がないため、実際に行う必要があります。スーパークラスを初期化する他の合理的な方法はありません。

サブクラスであるか外部クライアントであるかに関係なく、指定された初期化子を呼び出す必要があります。上記のドキュメントは正しくありません。

2) クラスの指定された初期化子は、スーパークラスの指定されていない初期化子を呼び出しますか?

指定されていないイニシャライザがスーパーによって提供され、指定されたイニシャライザを呼び出すように実装されている場合、親でイニシャライザを呼び出すことにまったく問題はありません。

前の回答では、基本的にすべてのスーパー クラス コンストラクターをコードなしで独自のコードに実装する必要があるように思われます。違う。コードがなくても安全に拡張できるように、スーパークラスの初期化子が存在するのはそのためです。

于 2012-09-24T08:39:37.490 に答える