2011-07-27 11 views
2

私は抽象クラスであるはずです。その抽象メソッドの1つでは、戻り値の型は、メソッドを実装しているクラスに応じて、class1、class2またはclass3のインスタンスです。私はどのように抽象クラスでメソッドを宣言すべきかと思います。私は動的な型定義を使用することを考えましたが、戻り値の型を3つのクラスのいずれかに限定し、すべての型ではなく、さらに上書きできるかどうかわかりません。抽象クラスの戻り値の型と一致します。"virtual"メソッドの戻り値の型はobjective-c

あなたが私にこれを手伝ってくれたら嬉しいです。
Tnx!

+0

あなたはクラスクラスターに似ていますか?その他の情報:http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/ClassCluster.html – Monolo

+0

でも問題は解決していない特定のメソッドだけではなく、クラス全体ではなく... – Niv

+0

クラスクラスのinitメソッドは非常によく似ているので、initメソッドを呼び出すと、内部ルールに基づいて特定のクラスのインスタンスが返されます。しかし、それはインスピレーションのためのものでした。 – Monolo

答えて

3

はこれを見てください:

#import <Foundation/Foundation.h> 

@interface A : NSObject { } 
- (A*) newItem; 
- (void) hello; 
@end 

@interface B : A { int filler; } 
- (B*) newItem; 
- (void) hello; 
- (void) foo; 
@end 

@implementation A 
- (A*) newItem { NSLog(@"A newItem"); return self; } 
- (void) hello { NSLog(@"hello from A"); } 
@end 

@implementation B 
- (B*) newItem { NSLog(@"B newItem"); return self; } 
- (void) hello { NSLog(@"hello from B: %d", filler); } 
- (void) foo { NSLog(@"foo!"); } 
@end 

int main (int argc, const char * argv[]) 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    A *origA = [A new]; 
    A *myA = [origA newItem]; 

    NSLog(@"myA: %@", myA); 

    B *origB = [B new]; 
    B *myB = [origB newItem]; 
    A *myBA = [origB newItem]; 

    NSLog(@"myB: %@\nmyBA: %@", myB, myBA); 

    [origA hello]; 
    [origB hello]; 
    [myA hello]; 
    [myB hello]; 
    [myBA hello]; 

    NSLog(@"Covariance?"); 

    [pool drain]; 
    return 0; 
} 

これはかなり凝縮構文であり、メモリ管理は吸うが、あなたはnewItemは思われる、仮想(newItemmyBAに戻りBを送る)と共変であることがわかりますあなたが欲しいものになるために。

あなたも行うことができます。注:それにfooを送る

B *myAB = (B*)[origA newItem]; 

をそれがAを返し、クラスが#fooをセレクタに応答しないことを教えてくれます。 (B*)キャストを省略すると、コンパイル時に警告が表示されます。

しかし、Objective-Cでは、共分散は大きな問題ではありません。

+0

+1はよく書かれた答えです。 – Perception