如何覆盖某些协议方法的实现

时间:2013-09-15 12:11:45

标签: ios objective-c protocols

我有一个班级ClassA,其定义protocol A继承自protocol B

@protocol protocolA <protocolB>

-(void)anAddedMethodToTheInheritiedMethod;
@end

@interface ClassA
@property (nonatomic,weak) id <protocolA> myDelegate;
@end

在另一个类(“MyClass”)中,我收到一个符合协议A的对象。

@interface MyClass
@property (nonatomic,weak) id <protocolA> myDelegate;
@end

在MyClass的实现中我创建了一个ClassA类型的对象

@implementation MyClass

-(void)someMethod
{
  self.myObjectOfTypeA = [ClassA new];
  self.myObjectOfTypeA.delegate = self.myDelegate;
}
@end

当然这是一个错误,因为self.myDelegate不响应

  

“anAddedMethodToTheInheritiedMethod”。

为了解决这个问题,我可以将MyClass对象设置为ClassA的委托,将所有委托方法存根,将self.myDelegate调用到它应答的方法,并回答ClassA中的“添加”委托方法。

但这是很多锅炉板代码,如果原始协议发生变化,容易破损。我确信有更清洁的方法来实现这一目标。

如何做到这一点?

1 个答案:

答案 0 :(得分:0)

听起来你想要的是一个类,它作为实现各种协议的其他几个类的代理。这个“调度程序”类将接收消息并将它们发送到实际处理它们的实例,类似于代理(只有隐藏在其后面的多个目标)。如果是这种情况,请使用message forwarding来减少样板代码的数量 - 而不是必须实现每个协议方法,只需实现消息转发方法并确定将消息转发到哪些对象。如果您的协议随时间而变化,您将不必经常向您的调度程序类添加方法,因为转发机制将负责这一点。有关该主题的更多详细信息,我强烈推荐Mike Ash