覆盖Objective C类中的方法

时间:2010-04-03 10:14:15

标签: objective-c runtime overloading

为什么我不能这样做,我怎么能在Objective C中执行相同的行为?

@interface Test
{

}

- (void)test:(Foo *)fooBar;
- (void)test:(Bar *)fooBar;

@end

提前致谢!

3 个答案:

答案 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;