Objective C中的繼承與復合技術

2021-06-23 02:00:05 字數 3421 閱讀 4766

學習了objective-c中有關類繼承的知識。紀錄如下:

1)oop程式設計中有兩個技術 用於描述類與類或物件與物件之間的關係;乙個是繼承 另乙個是復合。

2)在objective-c中每個子類只能有乙個超類,這一點與c++不同。

3)方法排程程式

該排程程式的功能非常重要,當乙個物件接收到乙個訊息後,排程程式會在接收物件的類中查詢與該訊息對應的方法,如果沒有找到排程程式就進入超類中查詢,如還是沒有則根據繼承規則繼續向上游查詢,如果到類繼承關係的最頂層(nsobject類)還沒有找到該訊息的方法時就報執行時錯誤(編譯時會報警告)。

4)self 與 super

a) self 是乙個隱含的指標,指向接收訊息的物件的指標。訊息所呼叫的方法使用該指標引數查詢它們要使用的例項          變數。

b)super來之**呢?它不是引數也不是例項變數,而是由objective-c編譯器提供的某種神奇的功能。向super發訊息時,實際上是在請求objective-c向該類的超類傳送訊息。如果超類中沒有定義的訊息,objective-c將按照繼承的通常規則在繼承鏈中查詢。

5)每個類都是nsobject的子類,而nsobject中定義了isa例項變數,所以每個類的物件(例項)第一例項變數就是isa,不過它是隱藏的。

今天接著講opp技術中的另外一門技術--復合:

在objective-c中復合是如何實現的?它是通過在類中宣告乙個指向另乙個類物件的指標作為例項變數,從而將這兩個類進行復合。

1)使用new 建立物件的時候,實際發生了兩個步驟;第乙個步驟,為物件分配記憶體,也就是說物件獲得儲存其實例變數的記憶體塊;第二步,就是自動呼叫init方法,初始化物件使其處於可用狀態。沒有被初始化的指標都使nil.

標頭檔案內容如下:

#import 

@inte***ce engine:nsobject

@end

//engine

@inte***ce tire:nsobject

@end

// tire

@inte***ce car:nsobject

-(void)print;

@end

//car

原始檔內容如下:

#import "carpart.h"

@implementationengine

-(nsstring *)description

@end

//engine

@implementationtire

-(nsstring *)description

@end

//tire

@implementationcar 

//注意init方法的返回值型別是id,即是乙個指向物件的指標,該函式在用new建立物件時自動被呼叫

-(id) init

//別忘了返回初始化後的物件指標

returnself;

}-(void)print

@end

//car

int main(int argc, const

char *argv)

2)我們看到上面的程式發現,該結構比較死,如果我們能隨時可以更換發動機和輪胎那麼我們程式的機構就更靈活了。也許你發現了,這樣修改是否像 策略模式 呢!

在這裡使用訪問方法來實現上述想法。

a)訪問方法:用來讀出或改變物件特定屬性的方法。

訪問方法分為setter 和 getter方法,一般setter方法前都是用"set"作為字首;getter方法前不能有 "get"字首。setter方法的命名基礎是「set」 + 「屬性名」;而 getter方法命名的基礎就是「屬性名」。

b)在cocoa中有「get」字首的方法是有特殊意義的,如果「get」字首出現在cocoa方法名稱中,這就意味著該函式的返回值是通過該函式的引數返回的。

c)setter方法和getter方法一般上成對出現的,當然可以不成對出現,如對於唯讀特性只有getter方法,對於密碼特性只有setter方法。

d)在objective-c中所有物件之間的互動都是通過指標實現的。

修改後的程式如下:

標頭檔案內容如下:

@inte***ce engine:nsobject

@end

//engine

@inte***ce tire:nsobject

@end

// tire

@inte***ce car:nsobject

-(engine *)carengine;

-(void)setcarengine:(engine*)engine;

-(tire*)cartireatindex:(int)index;

-(void)setcartire:(tire*)tire 

atindex:(int)index;

-(void)print;

@end

//car

原始檔內容如下:

//#import

#import "composition2.h"

@implementationengine

-(nsstring *)description

@end

//engine

@implementationtire

-(nsstring *)description

@end

//tire

@implementationcar 

/*//注意init方法的返回值型別是id,即是乙個指向物件的指標,該函式在用new建立物件時自動被呼叫

-(id) init

//別忘了返回初始化後的物件指標

return self;

}*/-(engine*)carengine

-(void)setcarengine:(engine*)engine

-(tire*)cartireatindex:(int)index

return (cartire[index]);

}//注意 下面這個函式的名稱的寫法,比較獨特 以後會詳細介紹

-(void)setcartire:(tire*)tire atindex:(int)index

cartire[index] = tire;

}-(void)print

@end

//car

int main(int argc, const

char *argv)

[carpart print];

return0;

}3)該程式我們還可以改進,我們不但可以隨時為我們的汽車安裝發動機和輪胎,而且我們使用「繼承」技術我們可以不斷的擴充套件新的發動機和輪胎,這樣我們還可以為我們的汽車安裝新品排的發動機和輪胎,挖塞!聽其來好像是使用了策略模式程式設計思想喔。

Objective C中的繼承

1.父類自身也可以有父類,沒有父類的類位於類層次的最頂層,稱為根類 父類也可以被稱為超類 2.繼承中,父類的非私有例項變數和方法都會成為新類定義的一部分。子類可以直接訪問這些方法和例項變數,就像在類定義中直接定義了這些子類一樣。注意 在子類使用例項變數,必須在介面部分宣告,而不是在實現部分宣告。在實...

理解類的繼承(Objective C)

繼承的特點 1.objective c的繼承具有單繼承的特點,每乙個子類都只有乙個直接父類 每次只能繼承乙個父類,可以多次繼承 2.格式 inte ce subclass superclass 方法定義部分 endsubclass類繼承了superclass類 3.當子類擴充套件父類時,子類可以繼承...

Objective C實現多繼承

我們都知道objective c不能像c 一樣支援多繼承,但是在objective c的使用經常會碰到需要使用多繼承的情況。例如,classa中有methoda,classb中methodb,而現在需要使用這兩個類中的方法。如何按照c 的程式設計思路,毫無疑問採用多繼承就搞定了,在objective...