OC语言day07-03协议应用场景1-类型限定

2016-06-30  本文已影响51人  liyuhong165

pragma mark 协议应用场景1-类型限定

pragma mark 概念

pragma mark 代码

###import <Foundation/Foundation.h>
#pragma mark 类
#import "Person.h"  // 人
#import "Wife.h"    // 妻子
#import "WifeCondtion.h"    // 协议
#pragma mark main函数
int main(int argc, const char * argv[])
{
    // 某个工程师 希望找个会做饭、洗衣服的女朋友。有工作优先
    // 满足条件的女生可以发消息
    
    // 会做饭 \
       会洗衣服 \
       有份好工作 \
    
#pragma mark code
    Person *p = [Person new];
#warning 协议的应用场景 找妻子要3个要素: 会做饭、洗衣服、有工作
    // 1.协议的第一个应用场景,可以将协议写在数据类型的右边
    // 明确的标注 如果想给该变量赋值,那么该对象必须遵守某个协议
    Wife<WifeCondtion> *w = [Wife new];
    
    p.wife = w;
    
    [p show];
    
    return 0;
}


Person.h //人类
#import <Foundation/Foundation.h>
#import "Wife.h"
@interface Person : NSObject
/** 妻子 */
// 注意: 记住一定,类型限定 是写在数据类型的右边
@property(nonatomic, strong)Wife<WifeCondtion> *wife;   // 人的妻子 必须会做饭、洗衣服、有工作

- (void)show;
@end
Person.m
#import "Person.h"
#import "WifeCondtion.h"
@implementation Person

- (void)show
{
    //   注意: 虽然在接受一个对象的时候,对这个对象进行了类型限定(限定它必须实现某个协议),
    //但是并不意味着这个对象是 就真正的实现了该方法, 所以每次在调用对象的协议方法是应该进行一次验证
    
    // 通过 respondsToSelector 会去查找这个方法有没有实现了 如果会返回一个BOOL值
    
    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 "WifeCondtion.h"

@interface Wife : NSObject <WifeCondtion>

@end
Wife.m
#import "Wife.h"

@implementation Wife

// 会做饭
- (void)cooking
{
    NSLog(@"%s",__func__);
}
// 会洗衣服
- (void)washing;
{
    NSLog(@"%s",__func__);

}
// 有工作
- (void)job
{
    NSLog(@"%s",__func__);

}
@end

WifeCondtion.h //妻子协议
#import <Foundation/Foundation.h>

@protocol WifeCondtion <NSObject>

// 会做饭
- (void)cooking;
// 会洗衣服
- (void)washing;
// 有工作
- (void)job;
@end

上一篇 下一篇

猜你喜欢

热点阅读