我有一个父类(super class) A,它有一个 BaseModalViewControllerDelegate
协议(protocol)和 id<BaseModalViewControllerDelegate> delegate
的保留属性.
我也有 B 类,A 的子类,它有一个 ModalLoginDelegate
协议(protocol)和 id<ModalLoginDelegate> delegate
的保留属性
现在,我将此方法设置为 B 类委托(delegate)的 setter 方法:
-(void)setDelegate: (id<ModalLoginDelegate>)delegate
{
_delegate = delegate;
[super setDelegate: (id<BaseModalViewControllerDelegate>)delegate;
}
所以,有实现这两个协议(protocol)的 RootViewController,但它只初始化 B 类,并且它只将自己设置为 B 类的委托(delegate),因为它不知道 B 类是 A 的子类。
您认为这是将 RootVC 设置为两种协议(protocol)的委托(delegate)的正确方法吗?谢谢
添加
将 B 类的协议(protocol)设置为从 A 类继承:
@protocol ModalLoginDelegate <BaseModalDelegate>
// delegate method of subclass
@end
现在,我的 RootVC 不必将自己设置为 BaseModalViewController 的委托(delegate)。但是现在,当在我的 B 类中我想调用父类(super class)的委托(delegate)方法时,我正在这样做
if (self.loginDelegate)
{
[self.loginDelegate baseModalViewController: self willDismiss: YES];
}
我认为这不是一个很干净的方式,所以我在父类(super class)
-(void)pressedCloseButton;
中创建了一个公共(public)方法它会这样做-(void)pressedCloseButton
{
if (self.delegate)
{
[self.delegate baseModalViewController: self willDismiss: YES];
}
}
在子类中:
-(IBAction)closeBtnPressed: (id)sender
{
[super pressedCloseButton];
}
你觉得对吗?
最佳答案
更好的设计是为您的子类实现一个单独的委托(delegate)属性,例如 loginDelegate
.更改子类中属性的类型并不是很好的 OO 设计。大多数 OO 语言甚至都不允许这样做。
这也确保了消费类“知道”有两个独立的委托(delegate)协议(protocol)涉及。RootVC
如果需要实现这两个协议(protocol),则需要将自己设置为两个委托(delegate)。你不能指望这个类不知道它需要实现哪些委托(delegate)协议(protocol)。如果 RootVC
认为它只处理基类然后它不会设置 loginDelegate 并且不会实现该协议(protocol)中的方法。
关于ios - 从子类 setDelegate 设置父类(super class)委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27973576/