8

フレームワーク開発者向けのヒントとテクニックに関するAppleのドキュメントを読んで、指定された初期化子に関する次のステートメントに出くわしました。

指定された初期化子は、スーパークラスのメソッドを呼び出すクラスのinitメソッドです init。(他の初期化子は、クラスによって定義されたメソッドを呼び出しinit ます。)すべてのパブリッククラスには、1つ以上の指定された初期化子が必要です。

(強調が追加されました。)

私の理解に基づいて、そして実際、「指定された」という言葉の使用そのものに基づいて、クラスには指定された初期化子を1つだけ含める必要があります。ただし、ドキュメントによると、複数の指定された初期化子が受け入れられます。

2つ(またはそれ以上)の指定された初期化子があると仮定すると、それらの役割は、適切なオブジェクトの初期化を保証するために、スーパークラスの指定された初期化子を呼び出すことです。しかし、両方の指定された初期化子が同じスーパークラスの指定された初期化子を呼び出している場合、そもそも複数の必要性があったのはなぜですか?クラスをリファクタリングして、他のすべてのinitメソッドを単一の指定された初期化子にファネルするべきではありませんか?

複数の指定された初期化子を必要とするユースケースまたはデザインパターンについて少し混乱していますか?

4

1 に答える 1

6

これは、同じクラスの異なるオブジェクトに対して異なる初期化を行う場合に行います。1つの例は、NSNumberのようなクラスクラスターです。保持できるさまざまな種類の数値用の初期化子がかなりあります。最も正確な表現を提供するには、クラスはキャストするのではなく、受け取ったのと同じ形式で値を保持する必要があります。これは、初期化子が単純に共通の初期化子を呼び出して戻ることができないことを意味します。彼らはいくつかのカスタム作業を行う必要があります。これにより、それらは指定された初期化子になります。

もう1つの例は、新しいファイルに対してのみ初期化を実行し、開いているドキュメントに対してのみ他の初期化を実行する必要があるドキュメントクラスです。これらの初期化子は両方ともスーパー実装を呼び出し、スーパー実装はプレーンinitメソッドを呼び出して一般的な初期化を行います。ただし、デフォルト値を使用して別の初期化子を呼び出すだけではないため、指定された初期化子と見なされます。

于 2011-09-21T15:08:44.993 に答える