Переопределить методы в классе Objective C - PullRequest
3 голосов
/ 03 апреля 2010

Почему я не могу сделать это, и как я могу выполнить то же поведение в Objective C?

@interface Test
{

}

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

@end

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 03 апреля 2010

Соглашение предусматривает изменение имени метода в соответствии с принятыми параметрами:

- (void)testWithFoo:(Foo *)foo;
- (void)testWithBar:(Bar *)bar;
5 голосов
/ 03 апреля 2010

Это называется перегрузкой, а не переопределением.Методы Objective-C не поддерживают перегрузку по типу, только по именам методов и параметров (и «перегрузка» на самом деле не очень хороший термин для того, что происходит)

4 голосов
/ 03 апреля 2010

Нет, вы не можете этого сделать. Это, на самом деле, «высоко динамичная» природа 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;
...