日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OC学习之面向对象三大特征

發(fā)布時(shí)間:2024/9/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OC学习之面向对象三大特征 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、繼承性 ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

繼承性是指,在某種情況下,一個(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)中可以用setget方法訪問(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。