一、繼承的應用場景
在上篇文章分析了繼承的應用,本文反過來講繼承和實例。可以理解對上文的繼承進行一下基礎知識的鋪墊,繼承的應用場景非常多,典型的應用場景包括:
1、單純屬性的繼承
這種繼承非常常見,在前面也舉過類似的例子,比如公司開發一款硬件產品,其通信協議為一個類Protocol,其中有二十個屬性。過了一年,公司生產了新的升級產品,多提供了幾項功能的監測,體現為增加了十幾個屬性。那么此時,就可以使用繼承類Protocol的方式來進行新硬件的協議的開發。既兼容老的硬件產品,又減少了新硬件產品開發的復雜度。
2、行為的繼承
同理,比如開發了一個監控軟件,當監控到某個現象或某個開關被觸發時,就報不同的警告并發送短信或通知消息等。當此監控軟件升級后,可能增加一些諸如天氣、揚塵等的監控,那么只需要繼承原有的事件類,就可以繼續在此基礎上開發新的功能。
3、混合繼承
這個就比較好理解了,可能我們的設備既需要硬件的數據屬性的增加又需要事件或消息的通信,而實際上這種情況更為多見,所以把二者統一繼承下來即可。
僅使用繼承的程序一般都是相對簡單的場景,更多是在繼承的基礎上使用多態。后面會更詳細的分析一下多態的設計應用。所以繼承的單一應用,一般都不會涉及到過多的復雜情況。如果涉及璚這種情況,大多數情況都是繼承僅僅在其中起到了一個很小的作用。這點大家要明白,繼承只是一個基礎,更多的豐富應用是在此基礎上展開的。
二、實際的例子
來看一個測量電力設備的協議處理:
struct w5a{
float I1;
float I2;
float I3;
float U0;
float U1;
float U3;
float S;
float P;
float Q;
};
struct w2k:public w5a{
double factor;
int type;
};
再看一個大橋監控的例子:
class monitor{
public:void sendBridgeTilt(Event* e,int type );void sendBridgeAltimeter(Event*e,int type);void sendMsg(int type,double d);
protected:double angle_;
};
class bj_monitor:public monitor{
public:void sendTrafficAccident(Event*e);void sendTrafficFlow(Event*e);
protected:double height_;
};
以大橋的監控為例,可能早期的大橋只控制大橋的高、傾斜等,后期可能為增加交通流量、事故處理等等。這種小而專的場景下,單純繼承的應用還是非常多的。另外一個非常多的情況是電力系統的儀表監控,記得類得繼承很深,原因就是一個設備往往衍生出幾個甚至十幾個升級版。如果開發者遇到這種情況,就可以非常清晰明白單純繼承的作用。
三、分析說明
大家有沒有看到上面的例子,它體現在一些專有場景上的應用能更清晰的看清楚繼承的應用,或者說這種場景更典型的舉出了繼承的例子。而一些中大型的軟件上,繼承其實很難單純的體現在學習者的眼前,它一定混合著不同的情況的應用,這樣就讓一些新手有些措手不及。
正如學習一個知識,由簡入深,循序漸進,才能更容易的理解和掌握這個知識,然后再加以應用,從中吸取經驗教訓,如此反復,則可以迅速的真正的理解這門知識。
四、總結
設計的學習難度說大很大,說小很小,關鍵看開發者的知識駕馭程度和水平。條條大路通羅馬,但有沒有捷徑,這種捷徑是否適合每個開發者?是不是有更適合具體到某一個人的捷徑?這就需要每一個開發者和設計者不斷的探索。
總體而言,多學習理論知識,多寫代碼,多看優秀的開源代碼和框架,多和優秀的設計者進行有效的交流。在此基礎上不斷的思考和實踐,對大多數開發者來說,是一條不錯的提升之路 !