OC学习之面向对象三大特征
一、繼承性 ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
繼承性是指,在某種情況下,一個(gè)類(lèi)下面會(huì)有一個(gè)子類(lèi),這個(gè)子類(lèi)理論上來(lái)說(shuō)會(huì)比之前的類(lèi)(父類(lèi))具體化。比如還是“狗”這個(gè)類(lèi),假設(shè)它里面有一個(gè)成員變量是身高和體重,有一個(gè)方法是咬人。然后再假設(shè)這個(gè)“狗”類(lèi)中有“哈士奇”和“金毛”這兩種狗,這兩種狗除了繼承其父類(lèi)中的成員和方法外,還有自己添加的一些,比如在“哈士奇”這個(gè)狗的類(lèi)中添加了打滾的行為,在“金毛”這個(gè)狗的類(lèi)中添加了賣(mài)萌這個(gè)行為,這些都是其父類(lèi)所不具有的,而子類(lèi)之間所獨(dú)有的行為和屬性是不能相互用的,就比如“哈士奇”不能賣(mài)萌,因?yàn)檫@是“金毛”私有的。
1.繼承的好處? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
1.抽取重復(fù)代碼
2.建立了類(lèi)之間的關(guān)系
子類(lèi)可以擁有父類(lèi)中的所有成員變量和方法
基本上所有的根類(lèi)都是NSObject
注意:
1.父類(lèi)必須聲明在子類(lèi)前面
2.不允許子類(lèi)和父類(lèi)有相同名稱(chēng)的成員變量
3.調(diào)用某個(gè)方法時(shí),優(yōu)先去當(dāng)前類(lèi)中找,如果找不到就會(huì)去父類(lèi)中找
重寫(xiě):子類(lèi)重新實(shí)現(xiàn)父類(lèi)中的某個(gè)方法,用來(lái)覆蓋父類(lèi)中以前的做法
每個(gè)對(duì)象里默認(rèn)有個(gè)isa指針,指向自己的類(lèi),自己的類(lèi)里默認(rèn)也有個(gè)supercalss指針,這個(gè)指針又指向父類(lèi),父類(lèi)用也有個(gè)supercalss指針,這個(gè)指針又指向NSObject類(lèi)
壞處:
耦合性太強(qiáng),即兩個(gè)類(lèi)的關(guān)系太緊密,如果父類(lèi)損壞,子類(lèi)就用不了
繼承的使用場(chǎng)合:
?1.當(dāng)兩個(gè)類(lèi)擁有相同屬性和方法的時(shí)候,就可以將相同的東西抽取到一個(gè)父類(lèi)中
?2.當(dāng)A類(lèi)擁有B類(lèi)中的部分屬性和方法時(shí),可以考慮讓B類(lèi)繼承A類(lèi)
組合:
和繼承的區(qū)別是,繼承是全部擁有,而組合是部分擁有.
基本用法
2.self和super? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
self是一個(gè)指針,指向當(dāng)前對(duì)象
self->成員變量
訪問(wèn)當(dāng)前對(duì)象內(nèi)部的成員變量
[self 方法名];
可以調(diào)用其他類(lèi)或者方法
self如果出現(xiàn)在對(duì)象方法中,self就代表對(duì)象
self如果出現(xiàn)在類(lèi)方法中,self就代表類(lèi)
[super 方法名];
直接調(diào)用父類(lèi)中的方法
調(diào)用的方法不僅限于對(duì)象方法,類(lèi)方法也可以
如果super處在對(duì)象方法中,那么就會(huì)調(diào)用父類(lèi)的對(duì)象方法
如果super處在類(lèi)方法中,那么就會(huì)調(diào)用父類(lèi)的類(lèi)方法
使用場(chǎng)合:子類(lèi)重寫(xiě)父類(lèi)的方法時(shí)想保留父類(lèi)的一些行為?
二、封裝性 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
封裝的意義,在于明確標(biāo)識(shí)出允許外部使用的所有成員函數(shù)和數(shù)據(jù)項(xiàng),或者叫接口。具備封裝性的程序是隱藏了某一方法的具體執(zhí)行步驟,取而代之的是通過(guò)消息傳遞機(jī)制傳送給它。比如說(shuō),“狗”這個(gè)類(lèi)中有“吠”這個(gè)方法,這個(gè)方法定義了狗具體應(yīng)該如何吠,但是外人并不需要知道它是如何吠的。
封裝是通過(guò)限制只有特定類(lèi)的實(shí)例可以訪問(wèn)這一特定類(lèi)的成員,而他們通常利用接口實(shí)現(xiàn)消息傳遞。通常來(lái)講,成員會(huì)根據(jù)他們的訪問(wèn)權(quán)限被分為三種:公有成員(public),私有成員(private),保護(hù)成員(protected)。
1.作用域 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
下面還要在說(shuō)一下作用作用域類(lèi)型:
| @public | 在任何地方都可以訪問(wèn)對(duì)象的成員變量 |
| @private(在類(lèi)的實(shí)現(xiàn)中默認(rèn)) | 只能在當(dāng)前類(lèi)的對(duì)象方法中直接訪問(wèn) |
| @protected(在類(lèi)的聲明中默認(rèn)) | 能在當(dāng)前類(lèi)和子類(lèi)的對(duì)象中直接訪問(wèn) |
| @package | 只要出于同一個(gè)框架中就能直接訪問(wèn)對(duì)象的成員變量 |
??如何訪問(wèn):
@public可以用指針,箭頭和變量名直接訪問(wèn),比如:p->_age = 10;
@private在當(dāng)前類(lèi)對(duì)象方法中,用變量名訪問(wèn)_height = 90;在其子類(lèi)中可以用set和get方法訪問(wèn),或者點(diǎn)語(yǔ)法
@protected能在當(dāng)前類(lèi)和子類(lèi)的對(duì)象方法中直接用變量名訪問(wèn)_weight = 100;
注:.m文件中的變量默認(rèn)就是@private(私有)
2.封裝的用法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
為了防止在主函數(shù)里給屬性不規(guī)范的賦值
所以去掉@public
然后可以在一個(gè)方法里給成員變量賦值
這時(shí)就用到了set方法
作用:提供一個(gè)方法給外界設(shè)置成員變量值,可以在方法里對(duì)參數(shù)進(jìn)行相對(duì)應(yīng)的過(guò)濾
命名規(guī)范:
1.方法名必須以set開(kāi)頭
2.set后面跟上成員變量的名稱(chēng),成員變量的首字母必須大寫(xiě)
3.返回值一定是void
4.一定要接收一個(gè)參數(shù),而且參數(shù)類(lèi)型跟成員變量類(lèi)型一致
5.形參名稱(chēng)不能和成員變量一樣
?
get方法
作用:返回對(duì)象內(nèi)部的成員變量
命名規(guī)范:
1.有返回值,返回值類(lèi)型與成員變量類(lèi)型一致
2.方法名跟成員變量名一樣
3.不需要接收任何參數(shù)
?
成員變量的命名規(guī)范
1.一定要以下劃線 _ 開(kāi)頭
2.可以跟局部變量區(qū)分開(kāi),一看到下劃線開(kāi)頭的變量,一半都是成員變量
類(lèi)方法:以+開(kāi)頭
其好處:
不用創(chuàng)建對(duì)象,直接執(zhí)行行為
類(lèi)方法只能用類(lèi)調(diào)用
OC弱語(yǔ)法體現(xiàn)
比如,沒(méi)有定義一個(gè)方法,但是卻可以調(diào)用這個(gè)方法,編譯也可以通過(guò)
3.封裝的好處 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
1.過(guò)濾不合理的值
2.屏蔽內(nèi)部的賦值過(guò)程
3.讓外界不必關(guān)注內(nèi)部的細(xì)節(jié)
三、多態(tài)性 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
利用多態(tài)創(chuàng)建對(duì)象時(shí),調(diào)用方法時(shí)會(huì)檢測(cè)對(duì)象的真實(shí)對(duì)象,調(diào)用真實(shí)地對(duì)象方法
個(gè)人理解:
利用其它的類(lèi)來(lái)創(chuàng)建對(duì)象
比如
A? *a = [B? do];
其實(shí)真正的類(lèi)還是B
1.多態(tài)總結(jié) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
1.沒(méi)有集成就沒(méi)有多態(tài)
2.代碼的體現(xiàn):父類(lèi)類(lèi)型的指針指向子類(lèi)對(duì)象
3.好處:如果函數(shù)/方法參數(shù)中使用的是父類(lèi)類(lèi)型,可以傳入父類(lèi),子類(lèi)對(duì)象
4.局限性:父類(lèi)類(lèi)型的變量不能直接調(diào)用子類(lèi)特有的方法,如果想用,必須強(qiáng)制換位子類(lèi)類(lèi)型變量后,才能直接調(diào)用
2.多態(tài)的局限性 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
父類(lèi)類(lèi)型的變量不能用來(lái)調(diào)用子類(lèi)的方法??
如果想這么多,可以利用類(lèi)型強(qiáng)制轉(zhuǎn)換
例子:
A是父類(lèi),D是子類(lèi),run是子類(lèi)方法
A *aa = [D new]; D *dd =(D *)aa; // 將aa轉(zhuǎn)為D *類(lèi)型的變量 [dd run];
3.多態(tài)的好處 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
如果參數(shù)中使用的是父類(lèi)類(lèi)型,可以傳入父類(lèi),子類(lèi)對(duì)象,可以節(jié)省代碼
void feed(Animal ×a) // 在動(dòng)物類(lèi)中創(chuàng)建一個(gè)喂食feed()方法 {[a eat]; }int main() {Dog *dd = [Dog new]; // 創(chuàng)建一個(gè)狗對(duì)象feed(dd); // 喂狗 Cat *cc = [Cat new]; // 創(chuàng)建一個(gè)貓對(duì)象feed(cc); // 喂貓 } // 可以看出不同的對(duì)象可以使用同一個(gè)類(lèi)方法
4.多態(tài)使用實(shí)例 ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? //例子: #import <Foundation/Foundation.h>@interface Animal : NSObject - (void)eat; @end@implementation Animal - (void)eat {NSLog(@"Animal---Eating something!!"); } @end@interface Dog : Animal @end@implementation Dog - (void)eat {NSLog(@"Dog--Eating something!!"); } @endint main() {//多種形態(tài)// Dog *d = [Dog new]; //Dog類(lèi)型Animal *a = [Dog new]; //調(diào)用一個(gè)對(duì)象方法時(shí),調(diào)用的是真實(shí)對(duì)象方法// NSObject *n = [Animal new];[a eat];return 0; } // 輸出結(jié)果為:Dog--Eating something!!轉(zhuǎn)載于:https://www.cnblogs.com/ZhenShi/p/5027226.html
總結(jié)
以上是生活随笔為你收集整理的OC学习之面向对象三大特征的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 不要伤害指针(3)--指针和结构类型的关
- 下一篇: iOS耳机操作