Ios 从子类setDelegate设置超类委托
我有一个超类a,它有一个Ios 从子类setDelegate设置超类委托,ios,objective-c,inheritance,delegates,Ios,Objective C,Inheritance,Delegates,我有一个超类a,它有一个BaseModalViewControllerDelegate协议和一个id委托的retain属性。 我还有一个类B,A的子类,它有一个modalgoindelegate协议和一个id委托的retain属性 现在,我将此方法设置为B类委托的setter方法: -(void)setDelegate: (id<ModalLoginDelegate>)delegate { _delegate = delegate; [super setDelegat
BaseModalViewControllerDelegate
协议和一个id委托的retain属性。
我还有一个类B,A的子类,它有一个modalgoindelegate
协议和一个id委托的retain属性
现在,我将此方法设置为B类委托的setter方法:
-(void)setDelegate: (id<ModalLoginDelegate>)delegate
{
_delegate = delegate;
[super setDelegate: (id<BaseModalViewControllerDelegate>)delegate;
}
我认为这不是一种非常干净的方法,所以我在超类-(void)中创建了一个公共方法,并按下了CloseButton代码>它将执行此操作
-(void)pressedCloseButton
{
if (self.delegate)
{
[self.delegate baseModalViewController: self willDismiss: YES];
}
}
在子类中:
-(IBAction)closeBtnPressed: (id)sender
{
[super pressedCloseButton];
}
您认为正确吗?更好的设计是为您的子类实现一个单独的委托属性,例如loginDelegate
。更改子类中属性的类型不是很好的OO设计。大多数OO语言甚至不允许这样做
这还确保消费类“意识到”涉及两个独立的委托协议
RootVC
如果需要实现两个协议,则需要将自己设置为两个委托。您不能期望类不知道需要实现哪些委托协议。如果RootVC
认为它只处理基类,那么它不会设置loginDelegate,也不会实现该协议中的方法。更好的设计是为子类实现单独的委托属性,比如loginDelegate
。更改子类中属性的类型不是很好的OO设计。大多数OO语言甚至不允许这样做
@protocol BaseModalViewControllerDelegate <NSObject>
-(void)doSomething;
-(NSString *)titleForThing;
@end
这还确保消费类“意识到”涉及两个独立的委托协议
RootVC
如果需要实现两个协议,则需要将自己设置为两个委托。您不能期望类不知道需要实现哪些委托协议。如果RootVC
认为它只处理基类,那么它就不会设置loginDelegate,也不会实现该协议中的方法。我完全不同意Paulw11在这里的回答,但有趣的是,苹果自己也会这样做。
@protocol BaseModalViewControllerDelegate <NSObject>
-(void)doSomething;
-(NSString *)titleForThing;
@end
例子。UIScrollView具有委托属性
@property (weak, nonatomic) id <UIScrollViewDelegate> delegate;
@property (weak, nonatomic) id <UITableViewDelegate> delegate;
@属性(弱、非原子)id委托;
子类UITableView具有委托属性
@property (weak, nonatomic) id <UIScrollViewDelegate> delegate;
@property (weak, nonatomic) id <UITableViewDelegate> delegate;
@属性(弱、非原子)id委托;
当我们在ObjC中声明一个协议时,我们通常让该协议扩展协议
@protocol BaseModalViewControllerDelegate <NSObject>
-(void)doSomething;
-(NSString *)titleForThing;
@end
@protocol BaseModalViewControllerDelegate
-(无效)剂量测定;
-(NSString*)标题值;
@结束
现在,上面的协议不仅有这里原型的方法,还有协议中的方法。它非常像这个协议是另一个协议的“子类”,继承了它的所有内容
如果你用你的第二个协议
@protocol ModalLoginDelegate <BaseModalViewControllerDelegate>
-(void)doAnotherThing;
-(NSString *)titleForTheOtherThing;
@end
@protocol-modalloindelegate
-(无效)不做任何事情;
-(NSString*)其他物品的标题;
@结束
那么,您在这里所做的将与苹果在UITableView和UIScrollView上所做的完全一致,因为id类型的指针始终也是id类型的对象,就像UIButton*始终能够作为UIView*传入一样
但如果不这样做,你的生活就会有一个根本性的问题
-(void)setDelegate:(id<ModalLoginDelegate>)delegate
-(void)setDelegate:(id)delegate
方法,因为您假设此对象符合BaseModalViewController Delegate协议,而您唯一可以确定的是它符合ModalLoginDelegate协议。某些继承的方法可能会使用self.delegate不响应的BaseModalViewController方法调用self.delegate。。
我希望这能有所帮助:)我完全不同意Paulw11的回答,但有趣的是,苹果自己也这么做。
例子。UIScrollView具有委托属性
@property (weak, nonatomic) id <UIScrollViewDelegate> delegate;
@property (weak, nonatomic) id <UITableViewDelegate> delegate;
@属性(弱、非原子)id委托;
子类UITableView具有委托属性
@property (weak, nonatomic) id <UIScrollViewDelegate> delegate;
@property (weak, nonatomic) id <UITableViewDelegate> delegate;
@属性(弱、非原子)id委托;
当我们在ObjC中声明一个协议时,我们通常让该协议扩展协议
@protocol BaseModalViewControllerDelegate <NSObject>
-(void)doSomething;
-(NSString *)titleForThing;
@end
@protocol BaseModalViewControllerDelegate
-(无效)剂量测定;
-(NSString*)标题值;
@结束
现在,上面的协议不仅有这里原型的方法,还有协议中的方法。它非常像这个协议是另一个协议的“子类”,继承了它的所有内容
如果你用你的第二个协议
@protocol ModalLoginDelegate <BaseModalViewControllerDelegate>
-(void)doAnotherThing;
-(NSString *)titleForTheOtherThing;
@end
@protocol-modalloindelegate
-(无效)不做任何事情;
-(NSString*)其他物品的标题;
@结束
那么,您在这里所做的将与苹果在UITableView和UIScrollView上所做的完全一致,因为id类型的指针始终也是id类型的对象,就像UIButton*始终能够作为UIView*传入一样
但如果不这样做,你的生活就会有一个根本性的问题
-(void)setDelegate:(id<ModalLoginDelegate>)delegate
-(void)setDelegate:(id)delegate
方法,因为您假设此对象符合BaseModalViewController Delegate协议,而您唯一可以确定的是它符合ModalLoginDelegate协议。某些继承的方法可能会使用self.delegate不响应的BaseModalViewController方法调用self.delegate。。
我希望这有帮助:)如果两个类都有一个属性delegate
,那么只有一个\u delegate
iVar,因此不需要调用super
。您的A类应该触发它的委托方法,尽管您应该保护它们以确保委托实现适当的protocolIt的正确性,但是,在不强制转换委托参数的情况下,Xcode会返回一个关于不同预期id的警告。我应该忽略它吗?更好的de