2012-04-15 7 views
0

これは愚かな質問かもしれませんが、とにかくそれはとにかく行きます。目的cでは、子クラスの初期化メソッドでは、self = [super init]を設定することがよくあります。さて、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に投稿したコメントから)。私はこれを望んでいる理由は、ある時点で私は親クラスのプロパティをivarsからおそらくちょうどいくつかの値を計算することに変えることができるかもしれないので、子供はそれらを正しくコピーする方法を知らないだろうということです。私はこれを書いています。誰かが同じ仕事をどうやって達成するかという良いアイデアを持っているかもしれないからです。

答えて

2

initメソッドは、実際にはすでに子クラスに対して作成されたオブジェクトを使用して作業しています。これを行うのはallocへの呼び出しです。これは、メッセージを送信したクラスを使用して、オブジェクトをどのように割り当てるかを判断しています。

つまり、子クラスのメソッドをオーバーライドすることができます。メッセージは常にオブジェクトに送信されます&メソッドルックアップは最上位クラスから始まります。

[self class]のように、親クラスの型を特定することもできます。しかし、これまでのところあなたを得ることはできません。 [[self class] displayColor]は、基本クラスのメソッド&のデフォルトのクラスメソッドの実装を実装するようなことを可能にしますが、必要に応じてサブクラスのクラスメソッドをオーバーライドします。

+0

@ Jenoxの回答 – user1258240

+0

に対する私の編集とコメントを参照してください。これは悪い考えのように思えます。 '[[self class] alloc] init]'を呼び出してコピーを作成(あるいは 'init'をスキップ)し、必要に応じて値を取り除くことができますが、部分コピーを使うと問題に遭遇するようです。 – wbyoung

+0

ええ、私はそれを行うことができたと思う、ありがとう!問題にぶつかることに関しては、私はとにかく試してみるのは冒険的ですが、このアプローチが厄介なシナリオを指定することができればうれしいでしょう。私がこれをしたい理由は、ある時点では、親クラスのプロパティをivarsからおそらくちょうどいくつかの値を計算することに変えることができるかもしれないので、子供はそれらを正しくコピーする方法を知らないでしょう。 – user1258240

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のインタフェースは、thing1またはwidthための宣言または実装を必要としません。あなたが異なる値を提供するために、サブクラスでthing1および/またはwidthを実装することが

@interface Bar : Foo 

@end 

@implementation Bar 

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

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

@end 

親クラスのインスタンスは、thing1の場合は常にYESを返し、サブクラスのBarはテストの結果(たとえば)によってYESまたはNOを返すことができます。

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

0

これはおそらく愚かな質問かもしれませんが、ここにはとにかく行きます。 目的cでは、子クラスの開始メソッドでは、しばしば self = [super init]を設定します。ここで、selfは子クラスであり、変換はありません は、親の クラスのinitメソッドが何らかの形で、実際に子クラス クラスに属するオブジェクトを返すことを意味します。

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


だから私の質問は:私は子クラスからオブジェクトを返す 子クラスから呼び出さ 親クラスに他のメソッドやプロパティを定義することができますか?あなたはスーパークラスの実装でselfを返すとき、あなたはメソッドと同じオブジェクトを取り戻すJavaで似たような私が思う ファクトリメソッドを呼び出したので、おそらくこの質問はあまりにも 法外ではない..です

がありますが呼び出されます。だから答えはイエスです。

+0

新しい編集を見て、私が何を意味しているかをよりよく説明してください。だからあなたの答えは、私はちょうど私のpartialCopyメソッドでIDの型を返し、子クラスの(MyClass *)に割り当てることができますか?それは私がキャッチの面で欲しかったよりも安全ですが、エラー.. – user1258240

関連する問題