为什么我不能这样做,我怎么能在Objective C中执行相同的行为?
@interface Test
{
}
- (void)test:(Foo *)fooBar;
- (void)test:(Bar *)fooBar;
@end
提前致谢!
答案 0 :(得分:5)
这称为重载,而不是覆盖。 Objective-C方法不支持类型上的重载,只支持方法和参数名称(并且“重载”对于正在发生的事情来说并不是一个很好的术语。)
答案 1 :(得分:5)
惯例是根据接受的参数对方法名称进行变化:
- (void)testWithFoo:(Foo *)foo;
- (void)testWithBar:(Bar *)bar;
答案 2 :(得分:4)
不,你不能这样做。这实际上是Obj-C的“高度动态”性质,正如你所说,这使得它成为一个非常糟糕的主意;想象:
id objectOfSomeType = [foo methodReturningId]; //It's not clear what class this is
[Test test:objectOfSomeType]; //Which method is called? I dunno! It's confusing.
如果你真的,真的想要这种行为,我假设你可以像这样实现它:
- (void)test:(id)fooBar
{
if ([fooBar isKindOfClass:[Foo class]])
{
//Stuff
}
else if ([fooBar isKindOfClass:[Bar class]])
{
//You get the point
}
}
在所有情况下,我都能想到,使用不变量的方法是最合适的:
- (void)testWithFoo:(Foo *)foo;
- (void)testWithBar:(Bar *)bar;