OC第三課 封裝 繼承 多型

2021-08-28 02:53:39 字數 4516 閱讀 3330

一. 封裝

在oc中,使用@inte***ce和@implementation來處理類.

@inte***ce像暴露在外面的鐘錶表面,像外界提供展示及介面

@implementation就好像隱藏在時鐘內部的構造實現,把具體的實現封裝了起來。

封裝的原理:例項變數預設只能被當前類的物件方法訪問。

封裝的目的:防止物件失去對例項變數的管理權。

封裝的作用:

a. 保護資料安全

b.隱藏複雜的內容

c.隔離變化

封裝的實現步驟:定義設定例項變數(setter)和訪問例項變數(getter)的方法

setter方法的作用:為外界提供乙個設定成員變數的值的方法可以監聽屬性的變化

1.setter方法一定是物件方法

2.一定沒有返回值

3.一定以set開頭,且set後面需要設定成員變數的名稱去掉下劃線,並且首字母大寫.

4.一定有引數,引數型別一定和需要設定的成員變數的型別一致,且引數名稱就是成員變數的名稱去掉下劃線

get方法的作用:為呼叫者返回物件內部的成員變數

1.getter方法一定是物件方法

2.一定有返回值,而且返回值一定和成員變數的型別一致.

3.方法名稱就是獲取的成員變數的名稱去掉下劃線.

封裝應用的示例**如下(外界只能通過訪問get和set方法訪問物件的成員變數):

類的.h檔案中

@inte***ce iphone :nsobject

-(void)setsize:(int)size;//setter宣告

-(void)setlength:(double)length;//setter宣告

-(int)size;//getter宣告

-(double)length;//getter宣告

@end

類的.m檔案中

@implemmentation iphone

-(void)setsize:(int)size

-(void)setlength:(double)length;//setter宣告

-(int)size

-(double)length

@end

注意:

如果某一屬性只提供了getter方法沒有提供setter方法,我們稱這個屬性為唯讀屬性;

如果某一屬性只提供了setter方法沒有提供getter方法,我們稱這個屬性為只寫屬性;

如果某一屬性同時提供了getter方法和setter方法,我們稱這個屬性為可讀可寫屬性;

如果某一屬性 沒有提供了getter方法沒有setter方法,我們稱這個屬性為私有屬性;

二.自定義快捷鍵

1.-(void)setsize:(int)size;//setter宣告

2.-(int)size;//getter宣告

用法:把第一條語句拖入到右下角框中,編輯edit,size替換為<#name#>,int替換為<#type#> ,size替換為<#name#>.

下次使用快捷鍵就會出現:-(void)setname:(type)name;供選擇;例:nsset;

三.點語法

1.如果給屬性提供了getter和setter方法,那麼訪問屬性就又多了一種方式,點語法

2.點語法本質是呼叫了我們的setter和getter方法.

3.點語法是乙個編譯器的特性,會在程式翻譯成二進位制的時候將,點語法自動轉換為setter和getter方法.

4.如果點語法在=號的左邊,那麼編譯器會自動轉換為setter方法;

5,如果點語法在=右邊,或者沒有等號,那麼編譯器會自動轉換為getter方法;

例子 person * p = [person new];

p.name = @」ok」 等價於[p setname : @」ok」];

四 .self關鍵字

1.如果self在物件方法中,那麼self就代表呼叫當前物件方法的那個物件.

2.如果self在類方法中,那麼self就代表呼叫當前類方法的那個類

注意:

1.self會自動區分類方法和物件方法,如果在類方法中使用self呼叫物件方法,會直接報錯,

2.不能在物件方法或者類方法中利用self呼叫 當前self所在的的方法 ,或出現死迴圈

使用場景:

1.可以用於在物件方法之間進行互相呼叫,

2.可以用於類方法之間進行互相呼叫.

總結:

我們只需要關注self在哪乙個方法中,

如果在類方法中那麼就代表當前的類,

如果在物件方法中那麼就代表當前的物件,

五:繼承

繼承就是子類擁有父類的屬性和方法。派生類不僅包括了基類的方法和屬性,同時派生類可以增加自己的方法和屬性。

繼承的實現:

匯入父類的標頭檔案

宣告類時繼承父類 例:@inte***ce dog:animal //繼承父類屬性

繼承的注意事項:

1.. 父類的私有屬效能被繼承,但不能被實現

2.. oc中是單繼承,只能繼承乙個父類

3.. 子類不能定義和父類同名的變數,但是可以繼承父類的變數

4. oc中支援多層繼承

重寫:在子類中重新實現父類中已經存在的方法,呼叫方法是會先找子類中是否有該方法,沒有會去父類中找。

super關鍵字:

1.如果呼叫子類中重寫方法時,子類和父類中存在同名的方法,利用super可以直接跳過子類,呼叫父類同名方法

2.可以利用super在任意方法中呼叫父類的方法.

例:[super ***方法 ];

六. 多型

概念:不同的物件以自己的方式響應父類同名方法。

在程式中的表現:父類指標指向子類物件.

注意:如果父類指標指向之類物件,如果需要呼叫子類方法,必須先強制型別轉換為子類才能呼叫.

多型的條件:有繼承關係,有方法重寫

多型的原理:動態繫結

多型的優點:簡化了程式設計介面,容許類和類之間重用一些習慣的命名。

1.多型在**中的體現,即為某一類事物的多種形態,oc物件具有多型性。必須要有繼承,沒有繼承就沒有多型。

2.在使用多型時,會進行動態檢測,以呼叫真實的物件方法。

3.多型在**中的體現即父類指標指向子類物件。

person *p = [student new];

p->age = 100;

[p walk]

二 多型使用注意

1.多型的好處

用父類接收引數,節省** 

需要乙個新的函式專門用來餵狗

void feed(dog *d)

如果這個時候也需要喂貓,那就應該重寫新乙個新的函式

void feed(cat *c)

而狗和貓實際上都繼承自動物這個類,在這裡就可以使用多型來簡化**了。

這裡只需要把函式的引數寫成是animal *型別的,那麼dog和cat型別的物件就都可以傳入進來。

-(void)feed(animal *)a

[person feed :cat/dog]
呼叫的時候直接改變引數就可以了。

2.多型的侷限性

不能訪問子類的屬性(可以考慮強制轉換)

不建議的做法:

animal *a=[[dog alloc] init];

[a run]; // 在animal類中沒有run方法,這裡呼叫了狗物件的方法。

解決方法:可以將a強制轉換為dog*型別的變數,如下:

dog *d=(dog *)a; // 使用強制轉換,這裡a和d指向的是同乙個狗物件
3.多型的細節

動態繫結:在執行時根據物件的型別確定動態呼叫的方法

python第三課答案 python第三課

字串操作 s alexwusir s1 s.capitalize 首字母大寫 print s1 全大寫,全小寫 s2 s.upper s21 s.lower print s2,s21 大小寫翻轉 s3 s.swapcase print s3 每個隔開 特殊字元或數字 的單詞首字母大寫 s alex ...

python第三課答案 python第三課筆記

以下哪個變數的命名不正確?為什麼?a mm 520 b mm520 c 520 mm d 520 mm 答 c不正確,不能數字開頭 在不上機的情況下,以下 你能猜到螢幕會列印什麼內容嗎?myteacher 小甲魚 yourteacher myteacher yourteacher 黑夜 print ...

python第三課答案 python第三課

1.迴圈物件,主要呼叫next 2.迭代器iterator 在理解上可以和迴圈物件理解為乙個東西。3.生成器 generator 自定義的迴圈物件。4.表推導 list comprehension 是快速生成表的方法。表推導用中括號。l x 2 for x in range 10 練習 f open...