我有一个应该是抽象的类。在其中一个抽象方法中,返回类型可能是 class1、class2 或 class3 的实例,具体取决于实现该方法的类。我想知道我应该如何在抽象类中声明该方法。我考虑过使用动态类型,但我希望将返回类型限制为 3 个类之一,而不是每种类型,此外我不确定我是否可以覆盖它,以便在继承类中返回类型不会匹配抽象类中的返回类型。
如果你能帮我解决这个问题,我会很高兴的,
Tnx!
我有一个应该是抽象的类。在其中一个抽象方法中,返回类型可能是 class1、class2 或 class3 的实例,具体取决于实现该方法的类。我想知道我应该如何在抽象类中声明该方法。我考虑过使用动态类型,但我希望将返回类型限制为 3 个类之一,而不是每种类型,此外我不确定我是否可以覆盖它,以便在继承类中返回类型不会匹配抽象类中的返回类型。
如果你能帮我解决这个问题,我会很高兴的,
Tnx!
看看这个:
#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
返回 a B
)和协变的,这似乎是您想要的。
请注意,您还可以执行以下操作:
B *myAB = (B*)[origA newItem];
但这会返回一个A
,并且发送foo
给它会告诉您该类不响应选择器#foo
。如果你省略了(B*)
强制转换,你会在编译时收到一个警告。
但是 ISTM 认为协方差在 Objective-C 中并不是什么大问题。