oc65--协议应用1,接口.做数据类型限定

简介:
复制代码
//  WifeCondition.h

#import <Foundation/Foundation.h>

@protocol WifeCondition <NSObject>
// 会做饭
- (void)cooking;
// 会洗衣服
- (void)washing;
// 有一份好工作
- (void)job;
@end
复制代码
复制代码
//  Person.h

#import <Foundation/Foundation.h>
#import "Wife.h"

@interface Person : NSObject

// 媳妇
// 注意: 记住一点, 类型限定是写在数据类型的右边的,协议修饰成员变量
@property (nonatomic, strong) Wife<WifeCondition> *wife;

- (void)show;

@end
复制代码
复制代码
//  Person.m


#import "Person.h"

@implementation Person

- (void)show
{
//    注意: 虽然在接受某一个对象的时候, 对这个对象进行了类型限定(限定它必须实现某个协议), 但是并不意味着这个对象就真正的实现了该方法. 所以每次在调用对象的协议方法时应该进行一次验证
    
    if ([self.wife respondsToSelector:@selector(cooking)]) {  //验证对象有没有实现这个方法
        
        [self.wife cooking];
    }
    
    if ([self.wife respondsToSelector:@selector(washing)]) {
        
        [self.wife washing];
    }
    
    if ([self.wife respondsToSelector:@selector(job)]) {
        
        [self.wife job];
    }
}
@end
复制代码
复制代码
//  Wife.h

#import <Foundation/Foundation.h>
#import "WifeCondition.h"

@interface Wife : NSObject <WifeCondition>    //协议就是写了接口的声明

@end
复制代码
复制代码
//  Wife.m

#import "Wife.h"

@implementation Wife
// 会做饭
- (void)cooking
{
    NSLog(@"%s", __func__);
}
// 会洗衣服
- (void)washing
{
    NSLog(@"%s", __func__);
}
// 有一份好工作
- (void)job
{
    NSLog(@"%s", __func__);
}
@end
复制代码
复制代码
//
//  main.m
//  协议的应用场景1-类型限定

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Wife.h"
#import "WifeCondition.h"  //导入.h文件,就是导包。

int main(int argc, const char * argv[]) {

    Person *p = [Person new];
    // 1.协议的第一个应用场景, 可以将协议写在数据类型的右边, 明确的标注如果想给该变量赋值, 那么该对象必须遵守某个协议
//    Wife<WifeCondition> *w = [Wife new];
    
    Wife *w = [Wife new];
    p.wife = w;
    
    [p show];
    
    return 0;
}
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7437090.html,如需转载请自行联系原作者
相关文章
|
8天前
|
编译器 C#
C#.Net筑基-类型系统②常见类型 --record是什么类型?
`record`在C#中是一种创建简单、只读数据结构的方式,常用于轻量级数据传输。它本质上是类(默认)或结构体的快捷形式,包含自动生成的属性、`Equals`、`ToString`、解构赋值等方法。记录类型可以继承其他record或接口,但不继承普通类。支持使用`with`语句创建副本。例如,`public record User(string Name, int Age)`会被编译为包含属性、相等比较和`ToString()`等方法的类。记录类型提供了解构赋值和自定义实现,如密封的`sealed`记录,防止子类重写。
|
8月前
|
存储 JavaScript 编译器
TypeScript-类型别名和类型别名、接口异同
TypeScript-类型别名和类型别名、接口异同
36 0
|
10月前
|
安全 Java
Java 泛型使用(类、方法、接口协议、类型通配符、通配符上下限)
Java 泛型使用(类、方法、接口协议、类型通配符、通配符上下限)
69 0
|
存储 消息中间件 JavaScript
看看人家在接口中使用枚举类型的方式,那叫一个优雅!下
看看人家在接口中使用枚举类型的方式,那叫一个优雅!下
|
存储 JSON 缓存
看看人家在接口中使用枚举类型的方式,那叫一个优雅!上
看看人家在接口中使用枚举类型的方式,那叫一个优雅!上
看看人家在接口中使用枚举类型的方式,那叫一个优雅!上
|
C++
接口 vs 类型别名
接口 vs 类型别名
52 0
|
Java
JAVA基础--注释的使用--标识符--数据类型及数据转换
JAVA基础--注释的使用--标识符--数据类型及数据转换
99 0
JAVA基础--注释的使用--标识符--数据类型及数据转换
|
Java
Java - 标识符、包、类、接口、方法、变量、常量的命名规则/规范
Java - 标识符、包、类、接口、方法、变量、常量的命名规则/规范
165 0
Java - 标识符、包、类、接口、方法、变量、常量的命名规则/规范
|
存储 程序员 Go
Go基础:接口类型、接口嵌套、空接口、类型判断
Go基础:接口类型、接口嵌套、空接口、类型判断
194 0
Go基础:接口类型、接口嵌套、空接口、类型判断
|
安全 C# 索引
.NET面试题解析(05)-常量、字段、属性、特性与委托
转自:http://www.cnblogs.com/anding/p/5255492.html   常见面试题目: 1. const和readonly有什么区别? 2. 哪些类型可以定义为常量?常量const有什么风险? 3.
1314 0