下面是两个类(Foo和Bar)和两个相应子类(SubFoo和SubBar)的定义。 Foo是一种虚拟类,Bar有一个将Foo实例作为参数的方法:
@interface Foo
@end
@interface SubFoo : Foo
@end
@interface Bar
- (void)doSthWithFoo:(Foo *)aFoo;
@end
@interface SubBar : Bar
// other methods
@end
跳过实现,但认为它们很简单。
只有在SubBar的实现中才有这样的转折:
@implementation SubBar
- (void)doSthWithFoo:(SubFoo *)aFoo
{
// Do stuff with object of type *SubFoo*
}
// other methods
@end
在子类中,重写doSthWithFoo:并将参数类型更改为SubFoo - 代替Foo,就像在父类中一样。这是故意这样做的,因为SubBar只能与SubFoo一起使用。
这个编译很好,运行良好并且不会产生任何警告 - 有点令人惊讶我必须承认。但不知何故,它感觉不太对,即使IMO这是一种相对干净的做事方式。
我知道可以传递一个id类型的参数,但是我会在Xcode中丢失类型检查(对于Foo)。我也知道同样可以通过分配id然后分配给特定类型或通过检查和转换来实现 - 虽然我没有尝试过这些选项。
这是一种“合法”的做事方式吗?还有其他选择吗?