はこれを見てください:
#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
は思われる、仮想(newItem
myBA
に戻りB
を送る)と共変であることがわかりますあなたが欲しいものになるために。
あなたも行うことができます。注:それにfoo
を送る
B *myAB = (B*)[origA newItem];
をそれがA
を返し、クラスが#foo
をセレクタに応答しないことを教えてくれます。 (B*)
キャストを省略すると、コンパイル時に警告が表示されます。
しかし、Objective-Cでは、共分散は大きな問題ではありません。
あなたはクラスクラスターに似ていますか?その他の情報:http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/ClassCluster.html – Monolo
でも問題は解決していない特定のメソッドだけではなく、クラス全体ではなく... – Niv
クラスクラスのinitメソッドは非常によく似ているので、initメソッドを呼び出すと、内部ルールに基づいて特定のクラスのインスタンスが返されます。しかし、それはインスピレーションのためのものでした。 – Monolo