Objective-C在具有不同参数类型的子类中重写方法

时间:2014-02-11 23:11:01

标签: objective-c parameters override subclass

下面是两个类(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然后分配给特定类型或通过检查和转换来实现 - 虽然我没有尝试过这些选项。

这是一种“合法”的做事方式吗?还有其他选择吗?

0 个答案:

没有答案