Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从子类setDelegate设置超类委托_Ios_Objective C_Inheritance_Delegates - Fatal编程技术网

Ios 从子类setDelegate设置超类委托

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

我有一个超类a,它有一个
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