OC中的動態繫結與多型問題

2021-07-04 21:41:54 字數 1413 閱讀 2338

1.什麼是多型?

程式中的多型:不同的物件以自己的方式響應相同名稱方法的能力稱為多型 

2.多型的條件 

多型的條件:有繼承關係、有方法重寫、父類的宣告變數指向子類物件。

3.多型的優點

多型的主要好處就是

簡化了程式設計介面

。它容許

在類和類之間重用一些習慣性的命名

,而不用為每乙個新加的函式命名乙個新名字。這樣,程式設計介面就是一些抽象的行為的集合,從而和實現介面的類的區分開來。

多型也使得**可以分散在不同的物件中而不用

試圖在乙個函式中考慮到所有可能的物件

。這樣使得您的**擴充套件性和復用性更好一些。當乙個新的情景出現時,您無須對現有的**進行改動,而只需要增加乙個新的類和新的同名方法。

4.動態繫結

動態型別能使程式直到執行時才確定物件所屬型別

動態型別繫結能使程式直到執行時才確定要對物件呼叫的實際方法

下面搞段**,建立兩個類,乙個是動物類,乙個是貓類,貓繼承動物,只拷貝類的實現:

#import "animal.h"

@implementationanimal

-(void)run

@end

#import "cat.h"

@implementationcat

-(void)run

-(void)eat

@end

#import

#import "cat.h"

int main(int argc,const

char * argv)

return0;}

animal

* cat = [

catnew

];這個就是多型,這麼理解吧,cat 既是動物也是貓,這就是它的兩種形態(也就是多型),所以可以用父類的物件指向子類,

當這個父類物件呼叫子類同名run()方法時,響應的是子類的方法,也就是貓在跑,如果父類呼叫子類特有方法,就要這麼呼叫,請看**

[(cat *)cat

eat];

這樣就是告訴編譯器,cat是貓,它有貓的方法,eat(),所以編譯不出錯,這也就是動態繫結,就是**在執行的時候才確定是什麼物件,所以我們就可以隨便用個oc物件型別的指標指向[cat new]都可以,只需要在呼叫方法時告訴編譯器這個物件是貓就行(注意,呼叫的方法一定要是貓存在的方法),所以這樣寫也可以:

nsstring * cat = [cat

new]; [(

cat*)cat

eat];

程式執行沒有問題,列印的是貓在吃,編譯會報個型別不匹配到警告

還記得init構造方法的複寫嗎?以前是返回id型別,而現在是返回instancetype,也是為了在編譯是提示程式設計師,別用不恰當到物件指標指向所返回的物件。

這就是我所理解的多型與動態繫結

Python 多型與動態繫結

coding utf 8 class geometricobject def init self,color green filled true self.color color self.filled filled defgetcolor self return self.color defset...

第一次接觸OC多型,動態型別與動態繫結

多型 允許不同的類定義相同的方法。動態型別 程式直到執行時才能確定所屬的類。動態繫結 程式直到執行時才能確定實際要呼叫的方法。id型別 一種通用的物件型別,也就是說,id可以用來儲存屬於任何類的物件,讓不同類的輸出不用特定設定,通用乙個id型別就好。多型的出現時為了讓不同的類能使用同明的方法。比如a...

早繫結的問題與動態繫結

物件可以作為自己的類或者作為它的基類 父類 的物件來使用。還能通過基類的位址來操作它。取乙個物件的位址 指標或引用 並將其作為基類的位址來處理,稱為向上型別轉換。也就是說,父類引用或指標可以指向子類物件,通過父類指標或引用操作子類物件。class human class dog public hum...