OC中的封裝繼承多型

2021-07-10 05:42:00 字數 4117 閱讀 8413

setter方法:

作用: 設定成員變數的值

格式:

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

2. 一定沒有返回值

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

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

5.setter方法的實現中,一定要給帶下劃線的成員變數賦值

getter方法:

作用: 獲取成員變數的值

格式:

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

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

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

4. 一定沒有引數

5.getter方法的實現中,一定要返回成員變數的值

封裝: 遮蔽內部實現的細節, 僅僅對外提供共有的方法/介面

好處: 保證資料的安全性

將變化隔離

規範: 一般情況下不會對外直接暴露成員變數, 都會提供一些共有的方法進行賦值

成員變數都需要封裝起來

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

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

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

如果某乙個屬性沒有提供了getter和setter, 我們稱這個屬性為私有屬性

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

// 點語法其實它的本質是呼叫了我們的setter和getter方法

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

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

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

點語法的注意點:

點語法一般用於給成員變數賦值, 如果不是給成員變數賦值一般情況下不建議使用, 但是也可以使用

self不能離開類, 離開類之後沒有任何意義

類方法中可以直接呼叫類方法

類方法中不可以直接呼叫物件方法

類方法中不能訪問成員變數

在類方法中呼叫類方法除了可以使用類名呼叫以外, 還可以使用self來呼叫

self不僅僅可以呼叫我們的類方法, 還可以呼叫物件方法

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

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

總結:

我們只用關注self在哪乙個方法中 , 如果在類方法那麼就代表當前類, 如果在物件方法那麼就代表」當前呼叫該方法的物件」

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

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

總結:

我們只用關注self在哪乙個方法中 , 如果在類方法那麼就代表當前類, 如果在物件方法那麼就代表」當前呼叫該方法的物件」

注意:

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

不能在物件方法或者類方法中利用self呼叫當前self所在的方法

使用場景:

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

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

可以用於區分成員變數和區域性變數同名的情況

只要a類繼承了b類, 那麼a類就擁有了b類的所有屬性和方法(物件方法和類方法)

// 其實在類名的後面加上: nsobject, 就是讓當前類繼承nsobject類

// new方法就是繼承過來的

// isa指標

// 繼承的語法 @inte***ce 類名 : 需要繼承的類

// 繼承了某個類的類我們稱之為子類

// 被繼承的這個類我們稱之為父類/ 超類

繼承:

當b類繼承a類, 那麼b類就擁有a類所有的屬性和方法(類方法/物件方法)

優點:提高**的復用性

可以讓類與類之間產生關係, 正是因為繼承讓類與類之間產生了關係所以才有了多型

注意:不要以為繼承可以提高**的復用性, 以後但凡發現多個類當中有重複**就抽取乙個父類

只要滿足一定的條件我們才能使用繼承

條件: ***x 是 *** / 某某某 is a 某某某

缺點:耦合性太強(依賴性太強)

// 如果子類中有和父類中同名的方法, 那麼我們稱之為方法重寫

// 注意: 繼承中的方法呼叫順序, 如果自己有就呼叫自己的, 如果自己沒有就呼叫父類的

// 方法的呼叫順序, 先自己再父類, 如果父類中沒有再爺爺類, 如果爺爺類再沒有就找爺爺的爸爸類

// 如果一直找到nsobject類都沒有找到, 那麼就會報錯

// reason: 『-[iphone signalwithnumber:]: unrecognized selector sent to instance 0x1003043c0』

// 在繼承中除了物件方法可以重寫, 類方法也可以重寫

// 只需要利用super給父類的方法傳送乙個訊息, 那麼系統就會自動呼叫父類的方法

// 如果以後想在子類中呼叫父類的方法可以使用super

// 如果想在給父類方法進行擴充套件的同時保留父類的方法, 那麼可以使用super呼叫父類同名的方法

super在類方法中, 一定會呼叫父類的類方法

super在物件方法中, 一定會呼叫父類的物件方法

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

// 多型: 事物的多種表現形態

// 動態型別: 在編譯的時候編譯器只會檢查當前型別對應的類中有沒有需要呼叫的方法

// 在執行時,系統會自動判斷a1的真實型別

animal *a1 = [dog new];

[a1 eat];

// 注意點: 在多型中, 如果想呼叫子類特有的方法必須強制型別轉換為子類才能呼叫

// [a1 kanjia];

dog *d1 = (dog *)a1;

[d1 kanjia];

什麼是多型:

事物的多種表現形態

在程式中如何表現:

父類指標指向子類物件

優點:提高了**的擴充套件性

注意點:

如果父類指標指向子類物件, 如果需要呼叫子類特有的方法, 必須先強制型別轉換為子類才能呼叫

例項變數修飾符

@public

可以在其它類中訪問被public修飾的成員變數

也可以在本類中訪問被public修飾的成員變數

可以在子類中訪問父類中被public修飾的成員變數

@private

不可以在其它類中訪問被private修飾的成員變數

可以在本類中訪問被private修飾的成員變數

不可以在子類中訪問父類中被private修飾的成員變數

@protected

不可以在其它類中訪問被protected修飾的成員變數

可以在本類中訪問被protected修飾的成員變數

可以在子類中訪問父類中被protected修飾的成員變數

注意: 預設情況下所有的例項變數都是protected

@package

介於public和private之間的

如果是在其它包中訪問那麼就是private的

如果是在當前**所在的包種訪問就是public的

例項變數修飾符作用域: 從出現的位置開始, 一直到下乙個修飾符出現

如果沒有遇到下乙個例項變數修飾符, 那麼就會修飾後面所有的例項變數

OC 封裝,繼承,多型

就是將一段 裝成乙個整體,將內部的例項變數和方法設定訪問許可權 1.set 方法1.作用 提供乙個方法給外界設定成員變數值,可以在方法裡面對引數進行相應過濾 2.命名規範 1 方法名必須以 set開頭 2 set後面跟上成員變數的名稱,成員變數的首字母必須大寫 3 返回值一定是 void 4 一定要...

OC 對封裝 繼承 多型的理解

理解封裝 將物件的狀態資訊隱藏在物件內部,不允許外部程式直接訪問物件內部資訊,而是通過該類所提供的方法來實現對內部資訊的操作和訪問。對乙個類或物件實現良好的封裝,可以實現以下目的 訪問控制符 objective c提供了4個訪問控制符 private package protected 和 publ...

OC基礎語法之封裝繼承多型

封裝 隱藏內部實現,穩定外部介面.封裝就是定義類 定義屬性 定義方法 set方法 提供乙個方法給外界設定成員變數的值,沒有返回值,一定要接收乙個引數,引數型別跟成員變數型別一樣,形參的名稱不能跟成員變數名一樣。get方法 返回物件內部的成員變數,肯定有返回值,返回值與成員變數型別一致,方法名跟成員變...