gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:12:27 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com