协议中的协议是否可以被视为采用的协议的一部分?

3
我将在遵循继承树的几个类中分配协议,如下所示:
第一个类
@protocol LevelOne
- (void) functionA
@end

@interface BaseClass : NSObject <LevelOne> {
}

第二类

@protocol LevelTwo <LevelOne>
- (void) functionB
@end

@interface SubClass : BaseClass <LevelTwo> {
}

稍后我将把该类作为其他类的委托属性来分配。
基类。
@interface AppClass : NSObject {
    @protected
    id<LevelOne> levelOneDelegate;
}

@property (assign) id<LevelOne> levelOneDelegate;

子类
@interface AppClassesFriend : AppClass {
    @protected
    id<LevelTwo> levelTwoDelegate;
}

@property (assign) id<LevelTwo> levelTwoDelegate;

在这个过程的结尾,AppClassesFriend有两个属性。当它被分配一个BaseClass对象时,“levelOneDelegate”可以访问“functionA”。
然而,我发现当它被分配一个SubClass对象时,“levelTwoDelegate”只能访问“functionB”。
为了使AppClassesFriend能够使用两个函数,似乎我需要同时分配levelOneDelegate和levelTwoDelegate。
是否有任何方法使“levelTwoDelegate”可以访问两个函数?因为这两个函数都在“SubClass”上可用。
所以,我想做的是:
SubClass *s = [SubClass alloc];
AppClassesFriend *a = [AppClassesFriend alloc];
a.levelTwoDelegate = s;

所以在AppClassesFriend(a)中,我可以使用:

 [self.levelTwoDelegate functionA];   <---- this is never found
 [self.levelTwoDelegate functionB];

但似乎我必须添加

a.levelOneDelegate = s;

感谢任何人抽出时间一直阅读到这里。因此,总结一下问题是,我如何让"levelTwoDelegate"能够访问functionA和functionB?
1个回答

2

只需声明您的子类代理属性实现了一级和二级协议(即实现了functionA和functionB):

@interface AppClassesFriend : AppClass {
    @protected
    id<LevelOne,LevelTwo> levelOneAndTwoDelegate;
}

@property (assign) id<LevelOne,LevelTwo> levelOneAndTwoDelegate;

谢谢 - 这是正确的,尽管我的问题似乎还有额外的方面!由于超类编码为仅使用levelOneDelegate,任何非重写方法默认使用该代码。在子类中无法重新分配levelOneDelegate以包括其他协议,因此要么基类需要知道所有协议(不可能,太松散),要么我似乎必须将接收器分配给两个代理。 - Michael
无法重新分配levelOneDelegate,但可以创建一个额外的委托类型来覆盖原始委托。例如,UITextView就是这样做的,以便其委托实现UITextViewDelegate而不是UIScrollViewDelegate。只需在SuperclassDelegate中声明functionA,在SubclassDelegate中声明functionA和functionB即可。 - hatfinch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接