2016年4月10日 星期日

C++class間的繼承關係研究方法


http://hatsukiakio.blogspot.tw/2009/05/cclassstruct.html
大概是上面網頁所寫的

基本上我們在做繼承時,通常只會繼承一次,避免程式碼會太複雜

繼承太多層反而會使得您維護程式變得更困難,例如您寫了很多個class都有函式叫做abc(),結果您要用繼承的方式將很多class整合成一個class,就會發生abc()衝突,

要處理好幾層您必須每一層都仔細檢查及規劃,就一般在上班而言,一個案子通常會有時間壓力,不太可能會有時間去玩這種繼承好幾次的東西(除非您做的超級大型(像是C++ builder),但通常這種大型的東西,不是一個人能維護的)

一般就是做一個通用的class,將他放在基底,
然後您要使用時,就將它繼承出來,利用virtual來改寫操作
這裡就還不講這個,這裡主要就是教您如何研究這種基底關係,

其實就如上面網頁寫的,繼承基本上就只是那樣子

但是發文不附圖,沒圖沒真相,沒看到實際的東西,您怎麼確定人家寫的是正確的

其實很簡單

您要研究這種關係,就寫兩個class Aclass 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.
}

這是一個最簡單的繼承關係,一般現在windowsIDE都會有提示功能,
如上我是將class B繼承class A
您在主程式片段就宣告個class B,然後輸入B.(如果是指標就是B->),他就會列出您可以存取的變數


class A裡面只有放int apublic,所以您要在class外直接存取變數,您看到只有a可以選擇


那假設您要在class B裡面的成員,直接使用變數,您可以使用this->(this就是指自己本身),看有誰可以看的到






基本上在研究時可以這樣簡單的看網路上教的對不對,要是您還不相信,就compiler看看,看是不是正確的,總之compiler完並且link成功,程式碼執行完沒跳錯誤,就代表是對的

但是通常案子一寫大,有時候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萬塊)

而是實際會對您的工作效率實質上的提升,

一般還在學習時,做太多的東西做管理,您會學得慢很多(當然要是您是學管理就另外講了)

總之,這文章只是要教您如何來研究這種繼承的關係而已,其他閒談就自己判斷了,繼承用法網路上其實都已經有寫了,我這邊再打一次其實沒有太大的意義

沒有留言:

張貼留言