【发布时间】:2015-01-15 21:46:21
【问题描述】:
我有一个超类 A,它有一个 BaseModalViewControllerDelegate 协议和一个 id<BaseModalViewControllerDelegate> delegate 的保留属性。
我还有 B 类,A 的子类,它有一个 ModalLoginDelegate 协议和一个 id<ModalLoginDelegate> delegate 的保留属性
现在,我将这个方法设置为 B 类委托的 setter 方法:
-(void)setDelegate: (id<ModalLoginDelegate>)delegate
{
_delegate = delegate;
[super setDelegate: (id<BaseModalViewControllerDelegate>)delegate;
}
所以,有一个 RootViewController 实现了这两个协议,但它只初始化 B 类,并且它只将自己设置为 B 类的委托,因为它不知道 B 类是 A 的子类。
您认为这是将 RootVC 设置为两种协议的委托的正确方法吗?谢谢
添加
将B类的协议设置为继承自A类:
@protocol ModalLoginDelegate <BaseModalDelegate>
// delegate method of subclass
@end
现在,我的 RootVC 不必将自己设置为 BaseModalViewController 的委托。但是现在,当在我的 B 类中我想调用超类的委托方法时,我正在这样做
if (self.loginDelegate)
{
[self.loginDelegate baseModalViewController: self willDismiss: YES];
}
我认为这不是一个很干净的方式,所以我在超类-(void)pressedCloseButton; 中创建了一个公共方法,它会这样做
-(void)pressedCloseButton
{
if (self.delegate)
{
[self.delegate baseModalViewController: self willDismiss: YES];
}
}
在子类中:
-(IBAction)closeBtnPressed: (id)sender
{
[super pressedCloseButton];
}
你觉得对吗?
【问题讨论】:
-
如果两个类都有属性
delegate,那么只有一个_delegateiVar,所以不需要调用super。您的 A 类应该触发它的委托方法,尽管您应该保护它们以确保委托实现适当的协议 -
这是正确的,但是,如果没有强制转换委托参数,Xcode 会返回一个关于不同期望 id 的警告。我应该忽略它吗?
-
更好的设计是为您的子类实现一个单独的委托属性,例如
loginDelegate。更改子类中属性的类型并不是很好的 OO 设计。大多数 OO 语言甚至都不允许这样做。这也确保了使用您的类的类“知道”涉及两个独立的委托协议 -
或者,如果您希望 B 类的委托也始终符合 A 类的委托,您可以使 B 类的委托符合两个协议。例如
@property(retain) id<ModalLoginDelegate, BaseModalViewControllerDelegate> delegate; -
RootVC如果需要实现这两个协议,则需要将自己设置为两个代表。你不能指望这个类不知道它需要实现哪些委托协议。如果 RootVC 认为它只是在处理基类,那么它不会设置loginDelegate并且不会实现该协议中的方法。
标签: ios objective-c inheritance delegates