大概是上面網頁所寫的
基本上我們在做繼承時,通常只會繼承一次,避免程式碼會太複雜,
繼承太多層反而會使得您維護程式變得更困難,例如您寫了很多個class都有函式叫做abc(),結果您要用繼承的方式將很多class整合成一個class,就會發生abc()衝突,
要處理好幾層您必須每一層都仔細檢查及規劃,就一般在上班而言,一個案子通常會有時間壓力,不太可能會有時間去玩這種繼承好幾次的東西(除非您做的超級大型(像是C++
builder),但通常這種大型的東西,不是一個人能維護的)
一般就是做一個通用的class,將他放在基底,
然後您要使用時,就將它繼承出來,利用virtual來改寫操作這裡就還不講這個,這裡主要就是教您如何研究這種基底關係,
其實就如上面網頁寫的,繼承基本上就只是那樣子
但是發文不附圖,沒圖沒真相,沒看到實際的東西,您怎麼確定人家寫的是正確的
其實很簡單
您要研究這種關係,就寫兩個class A,class B
如下:
class A{
public:
A(){};
~A(){};
int a;
protected:
int b;
private:
int c;
};
class B : public A
{public:
B(){
};
~B(){};
protected:
int d;
private:
};
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
B b;
b.
}
這是一個最簡單的繼承關係,一般現在windows的IDE都會有提示功能,
如上我是將class B繼承class A,您在主程式片段就宣告個class B,然後輸入B.(如果是指標就是B->),他就會列出您可以存取的變數
我class A裡面只有放int a在public,所以您要在class外直接存取變數,您看到只有a可以選擇
那假設您要在class B裡面的成員,直接使用變數,您可以使用this->(this就是指自己本身),看有誰可以看的到
但是通常案子一寫大,有時候include太多東西,或者是太多行,C++builder有時候就不會跳出這種提示出來,所以研究完還是需要記一下
如上面的圖,您可將class B : private A,或者class B : protected A,並用上面的方法,看他的成員是否可以存取,或者是說在哪裡可以存取,並且編譯看看是否可以使用,用這種方法可以研究繼承的關係
通常假設很趕時,有時候您要使用成員看不到,您就將該成員丟到public底下,基本上是可以直接使用的,不然其實挺麻煩的,您還要像書上特別多寫一個函式,int a_get(){return a;},來取得該變數的值,或者是取得成員的指標,如果您要設定的話還要寫a_set(int value),通常除非我時間太多,或者公司有硬性規定或者已經寫好了,不然我就會向我說的將成員丟到public,就直接使用了,
多一個函式存取變數要多4行,要是您有10個變數要存取,不就要多寫40行,案子一大每個地方都這樣管理,其實一個人做實在是有點太累了,當然如果要做程式碼管理的話,還是必須乖乖的寫那些東西拉,不過如果沒上級特殊要求,我通常是會這樣處理,因為多一個函數轉換不會帶給您寫code有比較大的好處,反而會讓您的案子進展比較慢(因為要寫很多行)
當然要是您功能都開發完了,您要做程式碼管理,我是認為OK的,
但是要是您這只是小案子,其實過個幾天您就換案子維護了,做這種多餘的事其實很無聊的,就算是大案子是我的話,我通常也是先丟pullic寫好程式後,再看看要不要封裝成上面講的那樣寫法(不然寫錯了要改好幾次)
:D當然,寫Code是為了賺錢,所以案子越快完成越好,您要做任何一項動作時,除非這個動作帶給您什麼好處,例如寫Code比較快啦,修改程式碼比較有架構啦,這樣根據這個好處,才會對程式碼做有好處的動作,
這很像您上班時,公司要您打很多報告(為了管理),假設您主要工作內容是修電腦,你把報告打完或者是做的很棒,您電腦會修得比較多台嗎,
假設修一台電腦可以賺1000塊,然後您一直修可以修10台,就賺了一萬塊
要是您加上打報告時間,說不定只完成5台,您就少賺了5000塊了,
不然乾脆就裝5台,您還有時間去喝杯咖啡,或者是下午茶,總之做任何動作通常要帶來一定的好處,這好處指不是人家賦予的(例如請您順便打報告付您2萬塊)
而是實際會對您的工作效率實質上的提升,
一般還在學習時,做太多的東西做管理,您會學得慢很多(當然要是您是學管理就另外講了)
總之,這文章只是要教您如何來研究這種繼承的關係而已,其他閒談就自己判斷了,繼承用法網路上其實都已經有寫了,我這邊再打一次其實沒有太大的意義
沒有留言:
張貼留言