美文网首页
继承时,遵守同一协议会怎么执行?

继承时,遵守同一协议会怎么执行?

作者: iOS代码搬运工 | 来源:发表于2020-07-11 16:17 被阅读0次
今天碰到一个疑问,具体是用在父类遵守某个协议,子类继承父类时,父类也实现了协议的方法,有个疑虑是是否会执行子类的方法呢?答案是不能的。
  • 思考:假设主人家养了动物,猫,猫继承动物,遵守一套吃的协议。当主人发出吃的信号时,看看动物和猫是怎么响应的。
// ActionDelegate.h
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@protocol ActionDelegate <NSObject>
- (void)eat;
@end

// Animal.h
#import <Foundation/Foundation.h>
#import "ActionDelegate.h"
#import "Person.h"
NS_ASSUME_NONNULL_BEGIN

@interface Animal : NSObject<ActionDelegate> //接受协议放置位置1
// 主人
@property (nonatomic, strong) Person *holder;
@end

NS_ASSUME_NONNULL_END


// Animal.m
#import "Animal.h"
@interface Animal() //<ActionDelegate> 接受协议放置位置2

@end

@implementation Animal
- (void)eat {
    NSLog(@"Animal eat");
}


- (Person *)holder {
    if (!_holder) {
        _holder = [[Person alloc] init];
        _holder.delegate = self;
    }
    return _holder;
}
@end
// Cat.h
#import "Animal.h"
NS_ASSUME_NONNULL_BEGIN

@interface Cat : Animal
//- (void)eat; // 此处可不用写也行3
@end

NS_ASSUME_NONNULL_END

//Cat.m
#import "Cat.h"

@implementation Cat
- (void)eat {
    NSLog(@"Cat eat");
}
@end
// Person.h
#import <Foundation/Foundation.h>
#import "ActionDelegate.h"
NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject
@property (nonatomic, weak) id<ActionDelegate> delegate;
- (void)CallAnimalEat;
@end

NS_ASSUME_NONNULL_END

// Person.m
#import "Person.h"

@implementation Person
- (void)CallAnimalEat {
    if (self.delegate && [self.delegate respondsToSelector:@selector(eat)]) {
        [self.delegate eat];
    }
}
@end
//ViewController.m
#import "ViewController.h"
#import "Animal.h"
#import "Cat.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Animal *animal = [[Animal alloc] init];
    [animal.holder CallAnimalEat];
    
    Cat *cat = [[Cat alloc] init];
    [cat.holder CallAnimalEat];
    // Do any additional setup after loading the view.
}


@end

执行结果如下:

2020-07-11 16:01:01.987303+0800 Delegate[6978:531839] Animal eat
2020-07-11 16:01:01.987522+0800 Delegate[6978:531839] Cat eat

附:
不论<ActionDelegate>放在接受协议放置位置1还是放在接受协议放置位置2 子类都不需要在.h文件中再对接受协议中的方法声明一次(参看:此处可不用写也行3)
子类实现了协议中的方法就执行子类的方法,不实现执行父类的方法。

相关文章

  • 继承时,遵守同一协议会怎么执行?

    今天碰到一个疑问,具体是用在父类遵守某个协议,子类继承父类时,父类也实现了协议的方法,有个疑虑是是否会执行子类的方...

  • day40-并发编程之协程

    一、协程 并发:同一时间段内,多个任务执行(单核CPU可以实现)。 并行:同一时刻,多个任务执行(只能多核) 协程...

  • Kotlin 协程之 join的一点理解

    总结一点 同一协程作用域内,只有子协程执行完毕后父协程才会执行完毕 对于join的一些理解写在注释里面了

  • 从OC到Swift (二)

    协议 只能被class继承的协议 被@objc修饰的协议,还可以暴露给OC去遵守实现 可以通过@objc定义可选协...

  • Golang学习笔记--协程和通道随笔

    并发:逻辑上具备同时处理多个任务的能力 并行:物理上在同一时刻执行多个并发任务 单线程的用协程做并发:协程在单个线...

  • 协程的上下文与异常处理

    1、协程的上下文是什么 2、组合上下文中的元素 3、协程上下文的继承 4、协程上下文的继承 5、协程上下文的继承 ...

  • 随笔36号20181021-go chan小体验

    今天怎么想go信道怎么弱,我想的是前端请求接口立刻返回结果然后后台协程执行,结果我发现必须两个协程使用同一个信道,...

  • 英镑的投机机会又来了,这次你敢赌吗?

    英国国会要进行脱欧协议了。 英首相警告:若议会否决脱欧协议将扼杀英国脱欧__财经头条 英首相警告:若议会否决脱欧协...

  • 随笔33号20180930-go协程小tips

    启动一个新的协程时,协程的调用会立即返回。与函数不同,程序控制不会去等待 Go 协程执行完毕。在调用 Go 协程之...

  • go channel详解

    协程,通道 我们在普通程序中要执行代码如下代码 错误使用协程 由于没有调度,主协程率先执行完毕,代码执行已经关闭,...

网友评论

      本文标题:继承时,遵守同一协议会怎么执行?

      本文链接:https://www.haomeiwen.com/subject/ensicktx.html