Objective-C中的Protocol

来源:互联网 发布:十二宫杀手解析知乎 编辑:程序博客网 时间:2024/06/05 07:03
1.@protocol 代表一个协议
2.谁遵循协议,谁就要实现协议中定义的方法
3.协议文件本身只是提供方法的声明,并不实现方法

4.协议本身也可以遵循其他协议,NSObject是一个基础协议,协议也可以同时遵循多个其他协议


main.m

#import <Foundation/Foundation.h>#import "Person.h"#import "MiddleStudent.h"int main(int argc, const char * argv[]){  @autoreleasepool {        /*        Person * p = [[Person alloc] init];            [p eat];        [p drink];        [p walk];        [p gamble];        MiddleStudent * st = [[MiddleStudent alloc] init];        [st eat];        [st listen];         */        //遵循协议的变量声明        //要求你创建的PErson对象必须是遵循了 PersonProtocol         Person * p = [[Person alloc] init];                Person<PersonProtocol> * p2 = [[Person alloc] init];        [p2 walk];                id<PersonProtocol> obj  = [[Person alloc] init];        }    return 0;}

Person.h

<span style="font-size:18px;">#import <Foundation/Foundation.h>#import "LiuMangProtocol.h"#import "PersonProtocol.h"#import "Car.h"//一个类可以同时遵循多个协议@interface Person : NSObject <LiuMangProtocol,PersonProtocol>@property(nonatomic,strong) Car<CarProtocol> * car;@property(nonatomic,strong) id<CarProtocol> obj;@end</span>

Person.m

#import "Person.h"@implementation Person- (void)walk{    NSLog(@"正常人走路");}- (void)eat{    NSLog(@"吃鸡蛋不吐皮");}- (void)drink{    NSLog(@"流氓喝酒不给钱");}/*- (void)gamble{    NSLog(@"流氓赌博总是赢");}- (void)lie{    NSLog(@"流氓爱撒谎");}*/@end

PersonProtocol.h

#import <Foundation/Foundation.h>//那些通用的功能@protocol PersonProtocol <NSObject>- (void)walk;@end

LiuMangProtocol.h

#import <Foundation/Foundation.h>#import "StudentProtocol.h"//@protocol 代表一个协议//谁遵循协议,谁就要实现协议中定义的方法//协议文件本身只是提供方法的声明,并不实现方法//协议本身也可以遵循其他协议,NSObject是一个基础协议,协议也可以同时遵循多个其他协议@protocol LiuMangProtocol <NSObject,StudentProtocol>//协议的条文,就是方法@required//必须实现,默认都是必须实现的- (void)eat;- (void)drink;@optional //可选实现- (void)gamble;- (void)lie;@end


PersonProtocol.h

#import <Foundation/Foundation.h>//那些通用的功能@protocol PersonProtocol <NSObject>- (void)walk;@end

StudentProtocol.h


#import <Foundation/Foundation.h>@protocol StudentProtocol <NSObject>- (void)listen;- (void)write;@end

MiddleStudent.h

#import "Person.h"//不需要许多的类去遵守的协议,也就是一个类特有的协议我们可以把它直接在这个类的.h文件中直接声明出来@protocol MiddleStudentProtocol <NSObject>- (void)skipClass;@end//父类遵循了那些协议,子类同样遵循那些协议@interface MiddleStudent : Person <MiddleStudentProtocol>@end


MiddleStudent.m


#import "MiddleStudent.h"@implementation MiddleStudent- (void)listen{    NSLog(@"listen课");}- (void)skipClass{    }@end

CarProtocol.h


#import <Foundation/Foundation.h>@protocol CarProtocol <NSObject>- (void)run;@end


Car.h

#import <Foundation/Foundation.h>#import "CarProtocol.h"@interface Car : NSObject<CarProtocol>@end


Car.m

#import "Car.h"@implementation Car@end



0 0