美文网首页
分类(类目)、延展、协议、代理(初学理解)

分类(类目)、延展、协议、代理(初学理解)

作者: 江湖闹士 | 来源:发表于2020-10-22 15:06 被阅读0次
//
//  main.m
//  CategoryExtensionProtocol
//
//  Created by lanouhn on 15/5/2.
//  Copyright (c) 2015年 lanouhn. All rights reserved.
//


#import <Foundation/Foundation.h>
#import "NSMutableDictionary+Sequence.h"
#import "NSDate+DateWithString.h"
#import "Person.h"
#import "Teacer.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
//***********************************************************************
         /*
         Category也叫分类或类目
         主要作⽤是为没有源代码(已知类或者自己创建的类)的类添加方法但是不能添加实例变量。
         通过Category添加的方法会成为原类的一部分。从而达到扩展一个类的功能。
         */
        /*
         新建文件
         选择Objective-C Category模板
         填写类名和分类名
         .h⽂文件添加⽅方法声明
         .m添加⽅方法实现
         */
        
        //分类(类目)只是为类扩充方法,不能扩充实例变量
        //分类并不是类,只是为原来的类扩充功能
        //类目的优先级要高于系统的优先级,如果和系统相同,会顶替系统
//***********************************************************************
        
    //为NSMutableDictionary添加一个排序方法,用来完成对字典所有key的排序(Category类目方法)
//        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"zhengzhou",@"henan",@"wuhan",@"hubei",@"changshan",@"hunan",@"dali",@"yunnan",@"qingdao",@"shandong", nil];
//        [dic sequence];
//        NSLog(@"%@",dic);
        
        
    //使⽤Category为NSDate类添加一个类方法 (dateWithDateString:),实现将下述字符串转换为NSDate对象。将@“20140402142850”转换为NSDate。
//        NSDate *date = [[NSDate alloc] init];
//        NSString *string = @"20140402142850";
//        [date dateWithString:(string)];
        
//***********************************************************************
 
        //延展:可以为我们自定义的类添加实例变量和方法,只不过通过延展添加的实例变量和方法是私有的,只能允许本类访问,外界无法访问
        //通过延展添加的方法和实例变量存在于 .m 文件中
        //延展的作用:隐藏一些不想让外界知道的一些操作。
        
//***********************************************************************
        //创建一个Person类
        
//        Person *person = [[Person alloc] initWithName:@"anni" gender:@"woman" age:18];
//        [person sayHi];
        
//***********************************************************************
      /*  Protocol(协议),是iOS开发中常用的技术。
        协议是一套标准(一堆方法的声明),只有.h文件。就像一张任务清单(或便利贴),上面写了一堆需要处理的事。清单交给谁,
        谁就要去完成清单上规定的任务。
        接受协议的对象实现协议中定义的⽅方法。即:清单交给谁,谁就
        要去完成清单上规定的任务。
       */
        
        //协议文件是一个 .h 文件
        //协议中存放的是一系列方法的声明
        //"<>"表示服从协议。Hobby现在服从NSobject协议中一系列的协议方法
        
        //协议中放的是方法的声明,服从该协议的类负责实现协议中得内容
        
        //协议中方法分为两种 1:必须实现@required  2:选择实现@optional
//***********************************************************************
//        Teacer *teacer = [[Teacer alloc] init];//协议
//        [teacer eatFood];
        
//***********************************************************************
        /*代理  以结婚为例
         1:创建协议方法(谁需要制定协议就在谁的.h文件中创建)
         2:创建代理人这个职位
         3:代理人服从协议,并且实现协议方法
         4:添加代理人
         5:协议方法调用
         */
        //首先创建两个类
        Boy *boy = [[Boy alloc] initWithName:@"狂飙" gender:@"男" age:25];
        [boy marry];
    }
    return 0;
}
类文件如图

NSMutableDictionary+Sequence

#import <Foundation/Foundation.h>

@interface NSMutableDictionary (Sequence)
- (void)sequence;
@end
#import "NSMutableDictionary+Sequence.h"

@implementation NSMutableDictionary (Sequence)
//为NSMutableDictionary添加一个排序方法,用来完成对字典所有key的排序(Category类目方法)
- (void)sequence{
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];
    [array addObject: [self allKeys]];
    [array sortUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
        return [obj1 compare:obj2];
    }];
}

@end

NSDate+DateWithString

#import <Foundation/Foundation.h>

@interface NSDate (DateWithString)
- (void)dateWithString:(NSString *)string;
@end
#import "NSDate+DateWithString.h"

@implementation NSDate (DateWithString)
//使⽤Category为NSDate类添加一个类方法 (dateWithDateString:),实现将下述字符串转换为NSDate对象。将@“20140402142850”转换为NSDate。
- (void)dateWithString:(NSString *)string{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyyMMddHHmmss"];
    NSDate *date = [formatter dateFromString:string];
    NSLog(@"%@",date);
}
@end

Person

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    NSString *_name;
    NSString *_gender;
    NSInteger _age;
}
@property NSString *name;
@property NSString *gender;
@property NSInteger age;

- (void)sayHi;

- (id)initWithName:(NSString *)name
            gender:(NSString *)gender
               age:(NSInteger)age;

@end

#import "Person.h"
//延展:可以为我们自定义的类添加实例变量和方法,只不过通过延展添加的实例变量和方法是私有的,只能允许本类访问,外界无法访问
//通过延展添加的方法和实例变量存在于 .m 文件中
//延展的作用:隐藏一些不想让外界知道的一些操作。
@interface Person (fuck)
//- (void)fuckYou;
@end

@implementation Person
- (id)initWithName:(NSString *)name
            gender:(NSString *)gender
               age:(NSInteger)age{
    self = [super init];
    if (self) {
        _name= name;
        _gender = gender;
        _age = age;
    }
    return self;
}
- (void)fuckYou{
    NSLog(@"骂人");
}
- (void)sayHi{
    NSLog(@"大家好,我叫%@",self.name);
    [self fuckYou];
}
@end

Hobby

#import <Foundation/Foundation.h>

@protocol Hobby <NSObject>
@required//默认的,必须执行
- (void)eatFood;
- (void)sleep;
@optional//选择执行
- (void)beatDouDou;
@end

Teacer

#import <Foundation/Foundation.h>
#import "Hobby.h"
@interface Teacer : NSObject<Hobby>

@end
#import "Teacer.h"

@implementation Teacer
//必须执行
- (void)eatFood{
    NSLog(@"吃饭");
}
- (void)sleep{
    NSLog(@"睡觉");
}
//选择执行
- (void)beatDouDou{
    NSLog(@"打豆豆");
}
@end

Girl

#import <Foundation/Foundation.h>
//1:创建协议方法(谁需要制定协议就在谁的.h文件中创建)
@protocol MarryDelegate <NSObject>
//协议方法默认必须实现
- (void)cook;
- (void)washCloth;
- (void)makeMoney;

@end




@interface Girl : NSObject
{
    NSString *_name;
    NSString *_gender;
    NSInteger _age;
    //创建代理人
    id<MarryDelegate> _delegate;
}
//为实例变量delegate添加setter方法
- (void)setDeledate:(id<MarryDelegate>)delegate;

@property (nonatomic) NSString *name;
@property (nonatomic) NSString *gender;
@property (nonatomic) NSInteger age;
- (id)initWithName:(NSString *)name
            gender:(NSString *)gender
               age:(NSInteger)age;

- (void)sendOrder;
@end
#import "Girl.h"

@implementation Girl
@synthesize name = _name;
@synthesize gender = _gender;
@synthesize age = _age;

//- (void)cook{
//    NSLog(@"做饭");
//}
//- (void)washCloth{
//    NSLog(@"洗衣服");
//}
//- (void)makeMoney{
//    NSLog(@"挣钱");
//}
//为实例变量delegate添加setter方法
- (void)setDeledate:(id<MarryDelegate>)delegate{
    _delegate = delegate;
}

- (id)initWithName:(NSString *)name
            gender:(NSString *)gender
               age:(NSInteger)age{
    self = [super init];
    if (self) {
        _name = name;
        _gender = gender;
        _age = age;
    }
    return self;
}

//向男孩发号施令
- (void)sendOrder{
//5:协议方法的调用
    [_delegate washCloth];
    [_delegate cook];
    [_delegate makeMoney];
}
@end

Boy

#import <Foundation/Foundation.h>
#import "Girl.h"
@interface Boy : NSObject<MarryDelegate>
{
    NSString *_name;
    NSString *_gender;
    NSInteger _age;
}
//结婚
- (void)marry;

@property (nonatomic) NSString *name;
@property (nonatomic) NSString *gender;
@property (nonatomic) NSInteger age;
- (id)initWithName:(NSString *)name
            gender:(NSString *)gender
               age:(NSInteger)age;
@end
#import "Boy.h"

@implementation Boy
@synthesize name = _name;
@synthesize gender = _gender;
@synthesize age = _age;

- (id)initWithName:(NSString *)name
            gender:(NSString *)gender
               age:(NSInteger)age{
    self = [super init];
    if (self) {
        _name = name;
        _gender = gender;
        _age = age;
    }
    return self;
}


- (void)cook{
    NSLog(@"给老婆做饭");
}
- (void)washCloth{
    NSLog(@"给老婆洗衣服");
}
- (void)makeMoney{
    NSLog(@"给家里挣钱");
}

- (void)marry{
    Girl *girl = [[Girl alloc] initWithName:@"如花" gender:@"女" age:50];
    //添加代理人
    [girl setDeledate:self];
    [girl sendOrder];
}
@end

相关文章

网友评论

      本文标题:分类(类目)、延展、协议、代理(初学理解)

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