Object C中對自定義類實現協議

2021-06-20 14:05:39 字數 2625 閱讀 8351

如果嘗試使用自定義類(例如,人類(person類)、位址簿類(mybook類)、分數類(fraction類))中的copy方法,如

[cpp]view plain

copy

mybook = [mybook mutablecopy];  

person = [person copy];  

等類似的操作,將會收到一條異常出錯的訊息,它可能如下所示:

-[fraction copywithzone:]: unrecognized selector sent to instance 0x7fabb8414380

這種錯誤,是對於自定義類,要實現使用自己的類進行複製,必須根據協議實現其中的一兩個方法。

下面將展示如何為自定義的分數類(fraction類)新增copy方法。注意:這裡描述的複製策略的技巧非常適合於你自己定義的類。如果這些類是任何foundation類的子類,那麼可能需要實現較為複雜的複製策略。必須考慮這樣乙個事實:超類可能已經實現了它自己的複製策略。

實現協議時,類必須實現copywithzone:方法來響應copy訊息。(這條copy訊息僅將一條帶有nil引數的copywithzone:訊息傳送給你的類)。注意,如果想要區分可變副本和不可變副本,那麼copywithzone:應該返回不可變副本,而mutablecopywithzone:應該返回可變副本。產生物件的可變副本並不要求被複製的物件本身也是可變的(反之亦然),想要產生不可變副本的可變副本是很合理的(例如,字串物件)。

在fraction.h檔案中如下所示:(其中fraction是nsobject的子類,並且符合nscopying協議)

[cpp]view plain

copy

#import 

@inte***ce fraction : nsobject

@property int

a, b;  

-(void

)setto:(

int) a over: (

int) b;  

-(void

)print;  

@end  

在實現檔案fraction.m中,為新方法新增如下定義:

[cpp]view plain

copy

#import "fraction.h"

@implementation fraction  

@synthesize a,b;  

-(void

)setto:(

int) aa over: (

int) bb  

-(void

)print  

//實現nscopying協議的方法,來使此類具有copy功能

-(id)copywithzone:(nszone *)zone  

@end  

在檔案main.m中對於上述類的測試**如下:

[cpp]view plain

copy

#import 

#import "fraction.h"

intmain(

intargc, 

const

char

* argv)  

return

0;  

}  

由此可以實現對自定義類fraction類的拷貝,執行結果如下:

2/5

1/3

該程式建立了乙個名為f1的fraction物件並將其設定為2/5.然後,它呼叫copy方法來產生副本,copy方法向你的物件傳送copywithzone:訊息,這個方法產生了乙個新的fraction,將f1的值複製到其中,並返回結果。回到main函式中,再將這個結果賦值給f2.隨即,將f2中的值設定為分數1/3,這樣就驗證了這些操作對原始分數f1是沒有影響的。

如果你的類可以產生子類,那麼copywithzone:方法將被繼承。在這種情況下,該方法中的程式行:

[cpp]view plain

copy

//無子類是可以這樣實現

fraction *newfract = [[fraction allocwithzone:zone] init];  

應該改為:

[cpp]view plain

copy

//有子類時,需要這樣實現

fraction *newfract = [[[self class

] allocwithzone:zone] init];  

這樣,可以從該類分配乙個新的物件,而這個類的copy的接收著(例如,如果它產生了乙個名為newfraction 的子類,那麼應該確保在繼承的方法中分配了新的newfraction物件,而不是fraction物件)。

如果編寫乙個類的copywithzone:方法,而該類的超類也實現了協議,那麼應該先呼叫超類的copy方法以複製繼承來的例項變數,然後加入自己的**以複製想要新增到該類中的任何附加的例項變數(如果有的話)。

你必須確定是否在類中實現淺複製或深複製,並為其編寫文件,以告知類的其他使用者。

vector中存放自定義類 ,對類的要求

vector中存放自定義類的前提是 自定義的類必須有預設建構函式。因為vector 會呼叫預設建構函式來初始化元素的物件。那必須要明確 編譯器什麼時候隱式宣告預設建構函式?有兩個條件 該類沒有顯式宣告任何建構函式。既然你都定義了,系統就不給你生成了。資料成員中沒有const 和reference。因...

object c中類的定義

一般來說乙個類的標頭檔案宣告的結構是這樣的 inte ce 類名 屬性宣告 方法宣告 end 欄位是私有的,在類外部不能使用。必須使用屬性,外部才能使用。什麼是屬性?其實屬性就是對乙個欄位的get和set方法。一般來說,給基本型別比如nsinteger的屬性新增的說明有nonatomic,assig...

實現java中自定義類載入器

前言 由於類的載入是採用委託模式,及先是父類載入器去載入載入失敗才是子類 要實現乙個類載入器不是複寫loadclass而是複寫findclass 原始碼主要邏輯就幾句 注意 這個findclass呼叫的原始碼 protected class loadclass string name,boolean...