0

これはばかげた質問かもしれませんが、とにかくここに行きます。Objective cでは、子クラスの開始メソッドで、self =[superinit]を設定することがよくあります。現在、selfは子クラスであり、変換は必要ありません。つまり、親クラスのinitメソッドは、実際に子クラスに属するオブジェクトを何らかの形で返します。

だから私の質問は:子クラスから呼び出されたときに子クラスからオブジェクトを返す親クラスで他のメソッドまたはプロパティを定義できますか?Javaにはファクトリメソッドと呼ばれる似たようなものがあると思うので、おそらくこの質問はそれほど法外ではありません。

編集1.意味を詳しく説明しましょう。ParentClassメソッドで、実際にはクラスChildClassのオブジェクトを操作していることがわかります。これは[セルフクラス]を見ることによるものです。ただし、子がどのクラスになるかを事前に知らずに、子クラスからオブジェクトを返すParentClassのメソッドを宣言したいと思います。さらに良いことに、返されたオブジェクトには正式な変換さえ必要ありません。

たとえば、次のようなことを行う親クラスのメソッドが必要です。

-(ChildClass *) partialCopyOfSelf {
//returns an object which is a partial copy of self (only copying properties that also
// exist in parent class, but such that applying [result class] will yield the child class
// and will require no further conversion

(ChildClass *) copy=[[ChildClass alloc] init];
//now copy stuff
return copy;
} 

子クラスで、次のようなものを実装できるようにしたいと思います。

-(MyClass *) copyOfSelf {
MyClass *copy=[super partialCopyOfSelf];
// now copy properties that only exist in my child class
return copy;
}

編集2(@wbyoungに書いたコメントから)。これが必要な理由は、ある時点で、親クラスのプロパティをivarから、たとえばいくつかの値を計算するだけに変更したい場合があるため、子供はそれらを正しくコピーする方法を知らないからです。誰かが同じタスクを達成する方法についてより良い考えを持っているかもしれないので、私はこれを書いています。

4

3 に答える 3

2

このinitメソッドは、実際には、子クラスですでに作成されているオブジェクトを処理しているだけです。これを行うのはそれへの呼び出しallocです。これは、メッセージの送信先のクラスを使用して、オブジェクトの割り当て方法を理解しています。

そうは言っても、子クラスのメソッドをオーバーライドできます。メッセージは常にオブジェクトに送信され、メソッドのルックアップは最上位のクラスから始まります。

[self class]親クラスで自分のタイプを把握するようなこともできます。しかし、それは今のところあなたを得るだけです。[[self class] displayColor]基本クラスにメソッドとデフォルトのクラスメソッドの実装を実装するようなことを行うことができますが、必要に応じてサブクラスのクラスメソッドをオーバーライドします。

于 2012-04-15T14:24:24.577 に答える
0

これはばかげた質問かもしれませんが、とにかくここに行きます。Objective cでは、子クラスの開始メソッドで、self =[superinit]を設定することがよくあります。現在、selfは子クラスであり、変換は必要ありません。つまり、親クラスのinitメソッドは、実際には子クラスに属するオブジェクトを何らかの形で返します。

まあ、正確ではありません。-initデフォルトidでは、ほぼすべてのオブジェクトを返すようになっています。これはコンパイラーにそのオブジェクトを通知し、自分が何をしているかを知っていると想定させるので、キャストする必要はありません。


だから私の質問は:子クラスから呼び出されたときに子クラスからオブジェクトを返す親クラスで他のメソッドまたはプロパティを定義できますか?Javaにはファクトリメソッドと呼ばれる似たようなものがあると思うので、おそらくこの質問はそれほど法外ではありません。

スーパークラスの実装に戻るselfと、メソッドが呼び出されたときと同じオブジェクトが返されます。したがって、答えは「はい」になります。

于 2012-04-15T14:28:25.033 に答える
0

はい 。Obj-Cは、ほとんどのオブジェクト指向言語に見られるすべてのサブクラス化ルールに従います。

例えば..

@interface Foo : NSObject

@property (readonly) BOOL thing1;
@property (readonly) CGFloat width;

@end

@implementation Foo

-(BOOL)thing1
{
 return YES;
}

-(CGFloat)width
{
 return 30.0f;
}

@end

のインターフェースでは、またはBarの宣言や実装は必要ありません。thing1width

@interface Bar : Foo

@end

@implementation Bar

-(BOOL)thing1
{
if(test) return YES; 
else return NO;
}

-(CGFloat)width
{
 return [super width] + 20.0f;
}

@end

ただし、異なる値を提供するために、サブクラスに実装thing1したり、サブクラスに組み込んだりすることができます。width

親クラスのインスタンスは常にYESプロパティthing1を返しますが、そのサブクラスBarは、テストの結果に応じてYESまたはNOを返すことができます(たとえば)。

もう1つのプロパティwidthは、親クラスの値を使用して変更します。

于 2012-04-15T14:22:34.307 に答える