Как получить доступ к методу путем наследования @protocols в Objective-C? - PullRequest
0 голосов
/ 19 февраля 2010

У меня есть программа, в которой существует наследование протоколов:

@protocol A
-(void)methodA
@end

Протокол, который наследует:

@protocol B<A>
-(void)methodB
@end

Класс, который реализует метод @protocolA:

@interface classB<B>

@end

@implementation classB
-(void)methodA
{
  //somecode
}
@end

Теперь я хотел, чтобы метод A вызывался из какого-то другого класса:

    @implementation SomeotherClass

{
   //call of methodA
   //????

id<A>obj=[[classB alloc]init];//i have tried it
[obj methodA];// even this is not working 
}

Как это сделать?

Ответы [ 2 ]

1 голос
/ 19 февраля 2010

Просто отправьте сообщение как обычно:

SomeotherClass *obj = [[[SomeotherClass alloc] init] autorelease];
[obj methodA];

Поскольку экземпляры класса B реализуют протокол B, они также утверждают, что отвечают на -methodA. Следующие компилируются и запускаются без проблем:

MyClass.h:

#import <Foundation/Foundation.h>

@protocol A
-(void) methodA;
@end

@protocol B <A>
-(void) methodB;
@end

@interface MyClass : NSObject <B>
{
}

@end

MyClass.m:

#import "MyClass.h"

@implementation MyClass

-(void) methodA
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
}

-(void) methodB
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
}

@end

код:

MyClass *obj = [[MyClass alloc] init];
[obj methodA];
[obj methodB];
[obj release];
0 голосов
/ 19 февраля 2010

Вы не говорите , как не работает. Я предполагаю, что есть ошибка компиляции, поскольку вы не реализуете methodB в вашем classB.

Другая возможность: что произойдет после того, как вы инициализировали classB в SomeOtherClass? Вы уверены, что вернули верный объект? Если бы он возвратил nil, время выполнения было бы в пределах его прав, чтобы ничего не делать, когда вы отправили ему сообщение methodA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...