protocol協定時為了補充Objective-C 隻能單繼承的缺陷而增加的一個新功能。Objective-C重所有的方法都是虛方法,是以在oc重也就沒有關鍵字 virtual一說,有了協定可以補充
Objective-C單繼承的缺陷,協定并不是一個真正的類,在協定的裡面隻聲明方法不實作,并且在協定當中不能聲明執行個體變量,如果一個類實作了某一個協定的方法,那麼稱折各類遵
循(遵守,采用)了這個協定,正式的協定在類中必須被實作,一個類可以實作多個協定,一個協定也可以被多個類實作,
格式 format:
@protocol protocol_name<protocol,....>
required_Method_Declarations //預設是required 在類中必須被實作
@optional
optional_Method_Declarations // 在類中可以選擇性的實作,
@required
required_Method_Declarations //在類中必須被實作,
@end
// MyPoint.h
#import <Foundation/Foundation.h>
//xieyi 協定 protocol
@protocol showOn
@required
-(void)printOn;
@end
// lei
@interface MyPoint : NSObject<showOn,NSCopying>{
int x;
int y;
}
@property (nonatomic,assign)int x,y;
-(id)initWithX:(int)_x andY:(int)_y;
@end
// leibie fenlei category 分類
@interface MyPoint(MoveSet)
-(void)moveToX:(int)_x andY:(int)_y;
@end
// MyPoint.m
#import "MyPoint.h"
@implementation MyPoint
@synthesize x,y;
-(id)initWithX:(int)_x andY:(int)_y{
if(_x==0)
x=1;
if(_y==0)
y=1;
x=_x;
y=_y;
return self;
}
//copyWithZone 方法,避免淺拷貝
-(id)copyWithZone:(NSZone *)zone{
MyPoint* newPoint=[[MyPoint allocWithZone:zone] initWithX:x andY:y];
return newPoint;
}
-(void)printOn{
NSLog(@" x = %d , y = %d ",x,y);
}
@end
@implementation MyPoint(MoveSet)
-(void)moveToX:(int)_x andY:(int)_y{
x=_x;
y=_y;
}
@end
// Circle.h
#import <Foundation/Foundation.h>
#import "MyPoint.h"
@interface Circle : NSObject<showOn>{
MyPoint* point;
int radius;
}
@property (nonatomic,copy)MyPoint* point;
@property (nonatomic,assign)int radius;
-(id)initWithPoint:(MyPoint* )_p andRadius:(int)_r;
-(id)initWithPoint:(MyPoint *)_p ;
@end
// Circle.m
#import "Circle.h"
@implementation Circle
@synthesize point;
@synthesize radius;
//重寫初始化方法
-(id)initWithPoint:(MyPoint *)_p andRadius:(int)_r{
if(_r==0)
{
radius=1;
}
if(_p==nil)
return nil;
if(self=[super init])
{
if(point!=_p)
{
if(point)
[point release];
point =[[MyPoint alloc]initWithX:_p.x andY:_p.y];
}
}
radius=_r;
return self;
}
//重寫初始化方法,
-(id)initWithPoint:(MyPoint*)_p{
self=[self initWithPoint:_p andRadius:10];
return self;
}
//實作協定中的方法。
-(void)printOn{
NSLog(@"point(x,y) = (%d,%d),radius = %d",point.x,point.y,radius);
}
@end
轉載于:https://www.cnblogs.com/wsq724439564/p/3270839.html