物件導向入門篇

在.NET Framework中,談物件導向的資料不多,但物件導向又很重要,在寫或設計物件導向,本身需要有高度「抽象化」的能力,而且絕大部份都是使用C#在談。可能是C#主要是吸引C、C++、Java方面的人來使用,所以這方面的資料很充足。但寫VB的人就比較幸苦點,除非你是雙語(C#、VB)人材,可以看C#轉VB,不然就…多用功…還是要自己加油!

  1. 物件導向(OOP)概念複習
    介紹VB中各種OOP的語法,當成複習用。
  2. 物件導向程式(OOP)設計入門(一)--物件設計
    介紹VB中Class、 Object及相關成員。
  3. 物件導向程式(OOP)設計入門(二)--物件建立
    介紹VB中Instance的建立,建構式、屬性、Me、多載、共用成員。
  4. 物件導向程式(OOP)設計入門(三)--物件導向
    介紹VB中物件導向及初始化、多重建構式。
  5. 物件導向程式(OOP)設計入門(四)--繼承Inheritance
    介紹VB中繼承。
  6. 物件導向程式(OOP)設計入門(五)--覆寫Overrides
    介紹VB中覆寫。
  7. 物件導向程式(OOP)設計入門(六)--抽象(Abstract)Class
    介紹VB中Abstract Class,在C#中直接使用Abstract關鍵字,我覺得很好,Abstract本身就是抽象的意思,不知道為什麼VB還要另外用一個MustInherit、MustOverride來當關鍵字,與「抽象」一點邊都沾不上,在記憶與聯想上就要小心一點。
  8. 物件導向程式(OOP)設計入門(七)--介面Interface
    介紹VB中Interface。

看完最後兩篇,你或許會覺得「Abstract」與「Interface」很像,但本質上兩者是不同的,你必須就使用的時機點與功能上的差異來比較,就能清楚了解什麼時候使用Abstract,什麼時間點使用Interface。

Abstract:

  • Abstract Class不能Instance。即不能使用New關鍵字初始化。
  • Abstract Class是必須被衍生Class覆寫方法。
  • 衍生Class可以部份實作。
  • 如果Class中包含Abstract Method(抽象方法),那麼此Class就必須定義為Abstract Class。
  • 一個Class只能繼承一個Abstract Class。
Interface:
  • Interface不能Instance,不能有建構式、成員。
  • 不能有修飾詞,Public、Private…等。
  • 不能宣告為共用成員。
  • 實作Interface必須實作Interface所有方法及屬性。
  • 一個Class可實作多個Interface。
除了實際功能面的差異外,另外Abstract Class一般都是在Class程式碼撰寫過程慢慢被發現,進而從Class提升為Abstract Class,我們應盡量讓Abstract Class擁有最多的共用程式碼,盡量減少資料。而Interface比較像定規格,一般而言都是一開始就設計、定義,也是另一種的「藍圖」,一開始在什麼都不知道的情況下,預先設計好相關架構。

如果從上述角度來看,除非你是「架構師」等級的人材,不然應該不太常使用Interface,而會常使用到Class與Abstract Class。等到你在整個Class與Abstract Class有一個層度後,那你可以更進一步向「Design Patterns(設計樣式)」來學習。

7 則留言:

  1. Dear KKBruce,

    看了你的 OOP for VB 入門篇獲益良多,感謝!

    此外,可否針對這一段話多做些解釋↓
    『Abstract Class一般都是在Class程式碼撰寫過程慢慢被發現,進而從Class提升為Abstract Class,我們應盡量讓Abstract Class擁有最多的共用程式碼,盡量減少資料。』

    回覆刪除
  2. Dear CM:
    我這樣解釋好了:

    我們很少一開始就直接寫Abstract Class,而是先寫Class,例如:

    Class dog
    function 叫()

    Class cat
    function 叫()

    Class horse
    function 叫()

    我們發現dog、cat、horse都是動物,而且都有一個"叫()"的方法,所以我們產生一個Abstract Class叫動物,然後定義一個"叫()"的抽象方法,讓dog、cat、horse…等需要的Class去繼承實現各自"叫()"的方法。

    Abstract Class animal
    function 叫()

    Class dog繼承animal後去實現"叫()"這個方法,牠實現出來的"叫()"是"汪汪"聲音。

    Class catg繼承animal後去實現"叫()"這個方法,牠實現出來的"叫()"是"喵喵"聲音。

    Class horsedog繼承animal後去實現"叫()"這個方法,牠實現出來的"叫()"是"馬~~"聲音。

    你會發現,在Abstract Class之中都是共同程式碼("叫()"方法),所以盡量減少"資料",資料即是"private name as string",name就是資料。

    讓Abstract Class只單純保有{抽象方法}就對了。

    回覆刪除
  3. 您好,

    請問抽象類別本身的作用是作為分門別類用?
    然後在該類別裡面提供共用的抽象方法,
    讓其子類別去繼承並實作;
    之後使用者閱讀相關技術文件時就知道這些子類別
    都歸類在這個抽象類別
    (就像生物的分類:界 門 綱 目 科 屬 種)。

    我本身是學Java的,
    覺得VB從.Net開使出現物件導向這個重大變革之後,
    從Java再跨過來學VB就覺得相似度很高,很快入手:)

    .Net Framework =
    Java Runtime Enviroment

    ASP透過VB語法寫出Web App =
    JSP透過Java語法寫出Web App

    除了跨平台的差異,其它都很相似:)

    回覆刪除
  4. 有此一說:「M?的工程師是邊看Java邊開發出.NET Framework!」So...很像、非常像、超級像...這樣才起吸引這些使用C/Java的人材轉到.NET來!

    從撰寫程式過程中來看,Abstract Class是從Child Class中發現了"共用"的東西,再由Child Class去繼承Base Class。

    你舉的例子很好,生物的分類也是"慢慢在發現的過程裡發現一些物種的{共通性}",鳥大概沒有四隻腳吧!有了這些{共通性}才有辦法去分類!

    我再延伸一下我的舉例:
    動物 --> 狗
    其實"狗"也可以改為"Abstract Class",因為狗下面還有很多"品種",像我家養"西施",宜蘭家養"土狗",每一品種都有差異,但他們都叫狗,所以把這些"狗"{共通性}的特質放到"狗抽象類別"中,再由"繼承的類別"去實作這些共通性特質。

    動物 --> 狗 --> 西施
    狗 --> 西施
    狗 --> 土狗

    但記得,西施或土狗除了實作"狗抽象類別"外,也必須實作"動物抽象類別",因為狗抽象類別是繼承動物抽象類別。所以牠是"狗"也是"動物"。

    有點轉來轉去,希望你看得懂。

    回覆刪除
  5. Dear KKBruce,

    感激您對於Abstract Class的詳細回答!
    請問會有OOP for VB 的進階篇和實用篇的寫作計畫嗎?

    再次感謝您的無私分享。

    回覆刪除
  6. 1. 如果有機會
    2. 如果有能力
    3. 如果有時間

    回覆刪除
  7. 有幫助喔,多謝。

    回覆刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。