ライブラリを作成していて、MyClass から継承する MyCustomClass をクライアントにインスタンス化させたいとします。ただし、クライアントは MyClass をインスタンス化しないでください。
アプローチ 1 : 実際には MyClass を非表示にする必要はありません。そのインスタンスのインスタンス化を避けたいだけです。
- a) コンストラクターを非公開にする
- b) MyCustomClass のインスタンスを作成するファクトリ メソッドを作成します。
ファクトリは MyClass の一部である場合もあれば、別の場所にある場合もあります。
@implemenation MyClass
+ (MyCustomClass*) createWith: (Param*) someData;
アプローチ 2 : 継承ではなく合成を検討します。MyCustomClassに MyClass 型のオブジェクトを所有させ、すべての作業を任せます。
@implementation MyCustomClass
@property (nonatomic,strong) MyClass* myClassInstance;
- (void) doSomething
{
[self.myClassInstance doSomething];
}
とにかくクライアントは MyClass をサブクラス化できないため、継承は実装の詳細です。必要がない場合は継承しないでください。
アプローチ 3 : 本当に MyCustomClass を公開したいですか? それは本当にオブジェクトですか、それともプロトコルですか? おそらく、ライブラリはインターフェイスをパブリックに提供する必要があり、MyClass と MyCustomClass はどちらもプライベートな実装です。