1

したがって、以下のようなヘッダー ファイルを含むライブラリがあります (たとえば)。

公衆

  • MyCustomClass.h (サブクラス MyClass)

プライベート

  • MyClass.h

ただし、これがアプリにインポートされると、見つからないと不平を言いますMyClass.h。これで十分です。編集#importされていますがMyCustomClass.h、まだ隠されています。

そこで、前方クラス宣言に変更しました@class MyClass。今では、スーパークラスに前方宣言を使用できないと不平を言っています(これも理にかなっています)。

どうすればこれを回避できますか?私は何かをサブクラス化する必要がありますが、ライブラリを使用している人だけがスーパークラスではなく子クラスにアクセスできるようにしたいのです。

4

1 に答える 1

1

ライブラリを作成していて、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 はどちらもプライベートな実装です。

于 2013-03-21T20:28:33.190 に答える