天天看點

Objective-C /iphone開發基礎:協定(protocol)

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