2

継承を理解しようとしている初心者です。いくつかのプロパティを持つ新しいオブジェクトを初期化し、他のクラスがそれらのプロパティに値を割り当てられるようにしたい場合、それらの他のクラスのインスタンスを作成する必要がありますか? 可視化:

-(ObjA *)init{
    self = [super init];
    self.property1 = [method from Class A];
    self.property2 = [method from Class B];
    self.property3 = [method from Class C]; etc...
    return self;
 }

言い換えれば、クラス A、B、および C がオブジェクト A が何であるかを知る必要があると仮定すると、これらのクラス メソッドをインスタンス メソッドにして、各オブジェクトを初期化する必要があるでしょうか? これについて別の方法はありますか?よろしくお願いいたします。

4

2 に答える 2

5

つまり、クラス A、B、および C がオブジェクト A が何であるかを知る必要があると仮定します。

いいえ


ClassA/B/C などから単純にメソッドを呼び出すことができますが、戻り値の型はそれぞれの と一致する必要がありますproperty

みましょう、あなたの方法はproperty1親切でなければなりませんNSStringClassA

-(NSString *)methodClassA{
   ...
   return someStringValue;
}

次に、次を使用する必要があります。

ClassA *objClassA=[ClassA new];
self.property1=[objClassA methodClassA];

または、次の方法でクラスメソッドを使用できます。

+(NSString *)methodClassA{
   ...
   return someStringValue;
}

そしてそれを次のように使用します:

self.property1=[ClassA methodClassA];
于 2013-05-12T05:00:55.960 に答える
2
assuming Class A, B, and C need to know what Object A is

オブジェクトの初期化コードは、別のオブジェクトが所有する機能を使用していない限り、自己完結型である必要があります。別のオブジェクトが所有する機能を使用している場合、オブジェクトはその機能のクライアントとして機能します。つまり、objectA は A、B、C のクライアントとして機能します (コードで見られるように)。

しかし、これは、A、B、C が objectA を知る (依存する) 必要があることを意味するものではありません。そうすることで、彼らは単独で存在する理由がないと言っているのです。

一般に、

  • すべてのクラスまたはメソッドには、1 つのカプセル化された目的が必要です。これにより、単独での理解、変更、およびテストが容易になります。情報をカプセル化して別のクラスを作成することを唯一の目的とするクラスを作成するのは一般的なパターンですが、それを 3 つの異なるクラスに分割するのは奇妙ではありません (その例を想像することはできません)。

  • オブジェクトは、使用できない状態で存在することを許可されるべきではなく、作成時に必須ではない情報を要求するべきではありません。objectA が機能するには、これらのプロパティが必要ですか? そうであれば、あなたのコードは正しいです。

実際の (抽象的ではなく) 例を使用して、疑問を再考してみてください。あなたはそれを自分で理解することになるかもしれません。

于 2013-05-12T05:34:27.667 に答える