標籤:style blog http color 使用 strong 資料 io
---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ----------------------
物件導向的三大特性(精華):(成員變數、方法)封裝、繼承、多態。
一、封裝
1.為什麼需要封裝?
根據以前學的內容,假如我聲明一個student類,裡面有public成員age.。我在主函數中寫代碼 student *s = [studentnew]。這樣的話我可以通過s→age修改age的值,但是會出現s→age=-10這種賦值,但是我們都知道年齡不可能為-10歲,我們沒有辦法阻值這種不合理的賦值。我們改變訪問成員變數的方法,使得該方法能夠濾掉不合理的賦值。
@interface就好像暴露在外面的時鐘錶面,像外界提供展示以及介面。@implementation就好像隱藏在時鐘內部的構造實現,把具體的實現封裝了起來。
2.Set方法:
在開發過程中,考慮到安全性要求,我們一般不在成員變數名前面使用@public、@protected等關鍵字修飾,而是使用Set方法來為對象提供成員變數的值。在set方法的內部也可以對一些不合理的賦值進行篩選過濾。
Set方法的作用:為外界提供一個設定成員變數值的方法
命名規範:
(1)方法名必須以set開頭
(2)Set後面跟上成員變數的名稱,首字母大寫
(3)傳回值一定是void
(4)一定要接收一個參數,而且參數類型需要和成員變數的類型一致
(5)形參名不能喝成員變數名一樣(蘋果官方推薦成員變數名前加_以示區分)
Set方法的好處:
(1)不讓資料暴露在外,保證了資料的安全性
(2)對設定的資料進行過濾
Set方法使用樣本:
Set方法的聲明:
Set方法的實現:
主函數:
3.get方法:
Get方法的作用:為調用者返回對象內部的成員變數
命名規範:
(1)一定有傳回值,傳回值的類型和成員變數的類型一致
(2)方法名和成員變數名一樣
(3)不需要接收任何參數
Get方法使用樣本:
Get方法的聲明:
Get方法的實現:
主函數:
注意1:在實際的開發中,不一定set和get方法都會提供,如果內部的成員變數比如學生的學號這樣的資料只允許外界讀取,但是不允許修改的情況,則通常只提供get方法而不提供set方法。
注意2:成員變數名的命名以底線開頭,get方法名不需要帶底線,使用底線開頭有兩個好處:(1)與get方法的方法名區分開來;(2)可以喝一些其他的局部變數區分開來,底線開頭的變數,通常都是類的成員變數。
4. 封裝的好處:
把細節、內部成員隱藏在裡面,保證了資料的安全性。有時候不會提供set方法和get方法,例如成員變數中如果有唯讀成員變數,只需提供get方法,不提供set方法即可。
6. 成員變數的命名規範:一定要以底線_開頭。好處為:
1> 觀察4中執行個體裡發現get的方法名和成員變數名一致,容易混淆。加入底線可以區分這兩個。
2> 可以跟局部變數區分開,一看到底線開頭的變數,一般都是成員變數,方便交流。
二、繼承
1.為什麼要使用繼承?
假如有一個類dog和一個類cat,他們的成員變數都是age、weight。方法也都一樣。那麼在兩個類裡面分別定義聲明就很囉嗦,很多東西都是一樣的。我們可以把這些相同的東西提取出來組成一個類animal,然後使用繼承功能,使dog、cat繼承animal類就具備animal的全部內容。在這個例子中dog、cat是animal的子類,animal是cat、dog的父類。使用這個功能可簡化大量代碼。
2.繼承的好處:
1>抽取重複代碼
2>建立了類的關係
3>子類可以擁有父類中所有成員變數和方法
3.注意點:基本上所有類的根類都是NSObject,new來自它,new是類方法。
4.繼承使用注意點:
1>父類必須放在子類前面
2>不允許子類和父類擁有擁有相同名稱的的成員變數
3>調用某個方法時,優先去當前類中找,如果找不到去父類找
5.重寫:子類重新實現父類中的某個方法,稱為重寫,可以覆蓋父類以前的做法。
6.繼承的壞處:使代碼的耦合性太強了
7.組合和繼承區別:繼承為xx是xx(student是person)、組合為xx有xx(student 有score)。
8.關鍵字super:
1>同self一樣是不需要加@的關鍵字
2>直接調用父類中的某個方法
3>super處在對象方法中,那麼就會調用父類對象方法;super處在類方法中,那麼就會調用父類的類方法。
3>比較常見的使用情境為,子類重寫父類方法時想保留父類的行為。
三、多態
1. 多態實質:父類指標指向子類對象,沒有繼承就沒有多態
2.多態的好處
在2的基礎上再設計一個類cat繼承animal,重寫eat方法,輸出“cat eat----”,再設計一個函數feed函數如下:
void feed (dog*d){ [d eat];}
這個函數可以執行dog吃的動作,但是不能執行cat吃東西的動作,如果想在主函數中調用讓cat吃東西的話,還要設計一個函數如下:
void feed2 (cat*c){ [c eat];}
這樣在主函數中寫入如下代碼:
Dog *dd = [Dognew];Cat *cc = [Catnew];feed(dd);feed(cc);
這樣才能成功調用貓和狗的吃。
3.多態局限性:
如果上述例子的狗類中多加一個對象方法run,執行如下代碼:
Animal *a = [Dognew];[a run];
執行上述代碼時發現有警告但能運行,我們規定不能這樣寫。這是多態的局限性:父類類型的指標不能用來調用子類的特有方法。如果實在想調用可以用強制轉換的方法實現,代碼如下:
Animal *a = [Dognew];Dog *d = [Dog *]a;[d run];
即必須轉化為子類類型指標變數。
---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ----------------------
詳細請查看:www.itheima.com