OC物件導向之多型

2021-06-27 12:49:39 字數 2479 閱讀 2043

一、多型的基本概念

多型(polymorphism)按字面的意思就是「多種狀態」。在物件導向語言中,介面的多種不同的實現方式即為多型。引用charlie calverts對多型的描述——多型性是允許你將父物件設定成為和乙個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作(摘自「delphi4 程式設計技術內幕」)。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。多型性在object pascal和c++中都是通過虛函式(virtual function) 實現的,而oc中沒有多繼承也就無需虛函式的概念,oc中的多型是通過簡單的繼承來體現的。

簡單說:就是乙個物件對應著不同型別.

多型在**中的體現:

父類或者介面的引用指向其子類的物件。

多型的好處:

提高了**的擴充套件性,前期定義的**可以使用後期的內容。

多型的弊端:

前期定義的內容不能使用(呼叫)後期子類的特有內容。

多型的前提:

1,必須有關係,繼承,實現。

2,要有覆蓋。 

二、多型在**中演示

首先,我們先創造乙個 子父類的繼承關係,父類:animal,子類:dog、cat;

如圖所示:

animal類:

// 動物

@inte***ce animal : nsobject

- (void)eat;

@end

@implementation animal

- (void)eat

@end

dog類:

// 狗

@inte***ce dog : animal

- (void)run;

@end

@implementation dog

- (void)run

- (void)eat

@end

cat類:

// 貓

@inte***ce cat : animal

@end

@implementation cat

- (void)eat

@end

測試程式:

#import // 這個函式是專門用來喂動物,狗吃東西

//void feed(dog *d)

////

//void feed2(cat *c) // 貓吃東西

////

// 如果引數中使用的是父類型別,可以傳入父類、子類物件

void feed(animal *a)

int main()

注意點:如果我們想呼叫貓或者狗的 「吃」 方法,我們可以能會書寫如下**:

這個函式是專門用來喂動物,狗吃東西

void feed(dog *d)

void feed2(cat *c) // 貓吃東西

但這個**不優雅,可以說很爛,我們通過上面的**知道,dog類中有- (void) eat 方法,cat類中有 - (void) eat方法,但這個兩個類中的eat方法均是抽取自animal類,如果我們通過改變形參的方式,來簡化**,這是多型的用武之地了。

// 如果引數中使用的是父類型別,可以傳入父類、子類物件

void feed(animal *a)

當然,這裡可能看起來差不多,但我們試想,如果乙個專案中,乙個函式不可能這麼簡單,在大專案中使用多型的手段,那麼**量將會減少很多,也會減少很多無用的冗餘**,**看起來也很優雅~

三、總結

1.沒有繼承就沒有多型

2.**的體現:父類型別的指標指向子類物件

3.好處:如果函式\方法引數中使用的是父類型別,可以傳入父類、子類物件

4.侷限性:

1> 父類型別的變數 不能 直接呼叫子類特有的方法。必須強轉為子類型別變數後,才能直接呼叫子類特有的方法 如:

animal *aa = [dog new];

// 多型的侷限性:父類型別的變數 不能 用來呼叫子類的方法

//[aa run];

// 將aa轉為dog *型別的變數

dog *dd = (dog *)aa; // dog乃

[dd run];

物件導向之多型

多型即事物存在的多種形態 要有繼承 要有方法重寫 要有父類引用指向子類物件 1,多型中的成員訪問特點之成員變數 編譯看左邊 父類 執行看左邊 父類 2,多型中的成員訪問特點之成員方法 編譯看左邊 父類 執行看右邊 子類 3,多型中的成員訪問特點之靜態成員方法 編譯看左邊 父類 執行看左邊 父類 總結...

物件導向之多型

多型指的是一類事物有多種形態,多型性是指在不考慮例項型別的情況下使用例項 class animals def run self print running class dog animals def run self print dog is running class pig animals de...

物件導向之多型

多型指的是一類事物有多種形態 動物有多種形態 人,狗,豬 import abc class animal metaclass abc.abcmeta 同一類事物 動物 abc.abstractmethod deftalk self pass class people animal 動物的形態之一 人...