C物件導向與多型性

2021-08-15 07:55:18 字數 1654 閱讀 7300

一、多型性

物件導向的基本思考方式是將資料和處理資料的行為放到一起,降低耦合性。其要點就是不要將資料和處理資料的行為分開

在 中「帶有檢查功能的棧」的示例**就將上限資料,下限資料和棧自身的資料都放在了棧結構體中,結果增加了耦合性。也就是說,僅將資料整合在一起,是絕對無法降低耦合性的。

物件導向程式設計有許多特性,其中非常重要的乙個特性就是多型性。所謂多型性就是指從呼叫者的角度看物件,會發現它們非常相似,難以區分,但是這些被呼叫物件的內部處理實際上各不相同。在上篇的例子中,在校驗push函式的值時,呼叫者只會呼叫validator的 validator函式,從外部並不知道其中到底進行了怎樣的校驗處理。

bool validate(validator * p,int val)

return p->validator(p,val);

}

實際上內部到底進行了怎樣的校驗處理,取決於validator自身。像這樣,通過將資料和處理成對分離,並使用結構體和函式指標實現多型性,被分離出來的部分也可以作為元件被重複利用。

二、繼承

typedef struct validatorvalidator;
這個方法適用於簡單情況,但情況稍微複雜一些,就顯得麻煩了。範圍檢查校驗器中,這個pdata指向的是range結構體。假設現在需要擴充套件檢查校驗器的功能,使得棧中只能接受奇數或者偶數,那麼僅簡單地擴充套件range的話,程式中的角色就會變得很模糊。雖然c不是物件導向語言,無法使用繼承功能優雅地解決這個問題,但還是有稍好一點的辦法的。

重新對**進行編寫:

//1

typedef struct validatorvalidator;

//2typedef structrangevalidator;

//3typedef structpreviousvaluevalidator;

#define newrangevalidator(min,max),                           \

(min),(max)                                \} 

#define newpreviousvalidator(),                        \

0                                          \

}bool validaterange(validator * pthis,int val)

bool validateprevious(validator * pthis,int val)

pprevious->previousvalue = val;

return true;} 

int buf[16];

rangevalidator validator = newrangevalidator(0, 9);

stack   stack = newstackwithvalidator(buf, &validator.base);

按照以下方法將rangevalidator 作為base使用即可擴充套件 rangevalidator

typedef struct

oddeventrangevalidator;

這樣,c中就可以使用繼承了!

物件導向之 多型與多型性

1.什麼是多型?多型指的是同一種事物的多種形態。水 冰,水蒸氣,液態水 2.為何要用多型?多型性 繼承同乙個類的多個子類中有相同的方法名 那麼子類產生的物件就可以不用考慮具體的型別而直接呼叫功能 3,如何用?例如 import abc class animal metaclass abc.abcme...

物件導向特性 C 多型性

1.多型性是物件導向程式設計的關鍵技術之一。2.利用多型性技術,可以呼叫同乙個函式名的函式,實現完全不同的功能。3.c 中有兩種多型性 編譯時的多型性和執行時的多型性。編譯時的多型性 通過函式的過載的運算子的過載來實現 函式過載是根據函式呼叫時所給的實參型別和數量,在程式執行前就知道應該呼叫哪乙個函...

物件導向的多型 多型性

多型指的是一類事物有多種形態,比如水有多種形態 冰 水 水蒸氣,但都是h2o,下面定義乙個h2o的父類和三種形態的子類 class h2o def init self,name,temperature self.name name self.temperature temperature deftu...