Google Dart - 類別(Class)

這次元旦連假真是放得夠久的,限量都忘了要補一下Dart的教學文章,廢話不多說馬上進入前言。在上一篇中我們了解了一些Dart的基本內建資料型態,這篇限量就來介紹一下Dart如何應用OO的特性,在這篇中限量會用OO常用的圖形相關類別建立的範例來說明OO的使用。



DartJavaScript最大的差別在於它屬於物件導向概念的程式語言,那麼就要提到類別(Class)。先前有提到在Dart中所有的instance皆是物件,所以不管是哪個ClassType,他們的基底類別(Base Class)皆為Object。建立instance的方式也是用new來產生。




上面範例中,限量建立了一個長方形的Class。長方形包含了長(_height), 寬(_width), 面積(_area)三個private field,其中_area設置一個getter可以取得_area的值。(在Dart Style中,底線的field或method為private,雖然Dart Editor的Intellegent sence也能取的到,但還是把這點當作是Dart程式撰寫規範吧!)
建構子(Constructor)方面比較特別,Dart中只能有一個和Class同名的建構子,範例中限量把_width與_height當作是選擇性參數(Optional Parameter),並給預設值,這樣User就可以選擇傳入長與寬參數。簡單的可以用選擇性參數搞定,但如果遇到複雜的情況就必須要具名建構子(Named Constructor),具名建構子顧名思義就是每一個建構子都有一個名字,上面的範例可以改成:

再來就要說到比較特別的,大家都知道Design Pattern的Factory模式,就是使用者不需要知道物件產生的過程,只要將必備的材料傳入就可以得到所要的物件。在一般OO語言中,建構子是不能回傳任何東西,但Dart只要在建構子前面加入一個factory的識別字就可以回傳物件,這樣有益撰寫Factory模式。Singleton也是類似的模式,所以限量用Dart寫了一個Singleton的範例:


能這麼快速實作一個Singleton範例主要有兩點,一為一開始就產生一個static final的instance,代表一開始使用到SingletonObj時就會產生一個共用的_instance;第二為factory建構子,這裡就直接將共用的_instance回傳,不然以往寫一個Singleton Class都要宣告一個GetInstance() Method來取得共用的instance,而且還要判斷_instance為null的時候才new一個instance。在上面範例Code中,多一個_internal建構子主要是為了取代原有的預設建構子功能,因為預設建構子已經拿來做Factory用了,如果不用另一個建構子來取代預設建構子功能的話會造成無窮迴圈喔。


抽象類別(Abstract Class)

抽象類別是為了將共用的方法, 欄位, 屬性抽出來作為基底類別減少重工,抽象類別只能夠被繼承實作,無法產生instance。在Dart中抽象類別一樣是在class前加上abstract,抽象類別內的方法可以實作完成給其他子類別共用,或定義成抽象方法(Abstract Method)讓每個子類別去各自實作此方法的邏輯。以下是抽象類別的範例:


範例中有個Figure的抽象類別,裡面定義了面積(_area)與計算面積(calculateArea)的抽象方法。長方形與圓形類別繼承Figure並各自覆寫實作calculateArea。


介面(Interface)


介面與抽象類別通常都會被搞混,在Java或C#中,介面只有定義方法名稱,實作則是由繼承的子類別來實作,就和抽象方法一樣。但介面和抽象類別不同的是,抽象類別的方可以先實作,介面則不行。Dart在這方面就有點不一樣了,Dart沒有interface這個識別字,interface的功能則是與class結合,只要用implements類別就能將類別當作是interface使用,類別中的所有方法或欄位都需要重新覆寫實作。


上面範例中,限量將圓形類別賦予靈魂,所以implements Spirit類別的所有方法,覆寫Spirit所有方法。


多重繼承(Multi-Inheritance)

使用到OO就難免會提到雙繼承的問題,因為雙繼承在常常在使用多型時會友一些問題,所以每種語言對雙繼承有不同的實作方法,像C#就有支援雙繼承,但Java就規定如果要雙繼承就用多個介面去實作。Dart當然也有提供雙繼承,在之前觀察Dart語法可以發現Dart語法和Java語法很雷同,Java沒有雙繼承,所以Dart就多了一個with的識別字,在with後面加上其他想繼承的類別就可以了。


範例中Tank同時繼承了Car與Weapon,所以同時擁有了兩個Class的欄位與方法,接著再覆寫Weapon的fire方法,呼叫原有的fire方法後再進行補充彈藥addBullet。

本篇簡單了介紹了在Dart中如何使用類別與一些基本的繼承應用,在OO中,繼承與多型是整個OO Programming的精隨,在Dart中使用多型設計模式和其他OO語言差不多,可以去Survey與多型設計相關的文章。限量才剛接觸Dart沒多久,所以很多Dart的用法還沒完全掌握,接下來就要開始學習Dart在Web Page中如何應用。


參考來源:

Dart - Classes




留言