ios - 从子类 setDelegate 设置父类(super class)委托(delegate)

标签 ios objective-c inheritance delegates

我有一个父类(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/

相关文章:

ios - 允许按钮在页面 View Controller 中触发新的 View Controller - swift

iphone - 如何在 UIImageView 上设置 UIGestureRecognizer?

java - 扫雷程序中的 NullPointerException

iphone - ViewController = _ViewController 的意思

c++ - 应该如何构建基本的类层次结构?

java - 使用子类的类型或其父类(super class)的类型创建子类对象

iphone - 如何更改 uinavigationbar 后退按钮文本

iOS swift : How to dismiss keyboard before compute-intensive code?

ios - CALayer IOS 上的自动布局约束

ios - 以编程方式将 UIImageView 添加到 UIScrollView