dart基礎之類介面操作符過載相關

你的使用者名稱發表於2019-03-11

Dart是一門物件導向語言,和java一樣,所有的類都繼承自Object。但是也有很多不一樣的地方,比如對建構函式的支援、操作符過載等新玩法,本次介紹一下dart中的新玩法。


1.類中省略很多關鍵字

在建立物件時可以省略new關鍵字,直接Class()就可以建立了。然後類中方法返回值也可以省略,省略後就是dynamic型別,在實際執行時確定實際型別。


2.表示私有類方法和屬性

在java中有private關鍵字代表私有,但是dart中並沒有private關鍵字,而是規定以下劃線_開頭的類、方法、屬性作為私有,對其他檔案不可見。在dart中沒有protected概念,只要不以下劃線開頭就是代表公有。


3.建構函式語法糖

在實際的開發中,經常在建構函式中給類中的變數賦值,而且寫的程式碼都是千篇一律毫無營養。在dart中可以對該情況進行簡寫,不需要大括號都可以搞定。如下,我們在A類中定義好了給x、y屬性賦值的最簡方式,注意,引數一定要this.開頭,不然執行是會報錯的,因為沒實現體,只有this.開頭的引數才可以不寫實現,系統自動給實現成給屬性賦值。然後還有一個注意點,這裡面的引數一定要寫全,比如寫成A(this.x)也會報錯的。

dart基礎之類介面操作符過載相關


4.命名建構函式

建構函式過載在java中是常用的,比如自定義view中需要同時寫3個建構函式。 Dart 並不支援建構函式的過載,而採用了命名建構函式為一個類實現多個建構函式。在dart中構造方法名可以修改為和實際業務相關,比如a功能呼叫A.a( )構造方法,b功能呼叫A.b( )構造方法。

dart基礎之類介面操作符過載相關


5.重定向構造方法

可以在構造方法上使用:this來重定向,呼叫該構造方法以後,相當於是呼叫另外的構造方法。需要注意的是,在java中是在方法體中使用this()的方式,dart中是不支援的。

dart基礎之類介面操作符過載相關


6.常量構造方法

如果你的類提供一個狀態不變的物件,你可以把這些物件 定義為編譯時常量。要實現這個功能,需要定義一個 const 建構函式, 並且宣告所有類的變數為final

dart基礎之類介面操作符過載相關


7.工廠構造方法

當實現一個使用'factory' 關鍵詞修飾的建構函式時,這個建構函式不必建立類的新例項。例如,一個工廠建構函式 可能從快取中獲取一個例項並返回,或者 返回一個子型別的例項。(工廠建構函式無法訪問 'this')

dart基礎之類介面操作符過載相關

利用這一特性,可以用工廠構造方法實現單例,dart中的單例和java中的類似,私有化構造方法,記錄對外getInstance方法,在getInstance中建立物件並且返回。提示一下當然和java的實現方式一樣,不使用這個構造方法,而是用一個static getInstance方法也是可以實現的。

dart基礎之類介面操作符過載相關


8.getter和setter

這個有點意思,將某個新屬性和類中其他屬性建立關係,每當該屬性變化時,可以直接給其他屬性賦值。相當於是Java中首先定義了一個right變數,然後再變數的set中寫好left=value-width,在get中寫好right=left+width,但是dart中直接簡寫了。

dart基礎之類介面操作符過載相關


9.操作符過載

dart是支援操作符過載的,可以將系統支援的操作符進行過載,賦予其另外的功能,目前dart中可以過載的操作符如下:

dart基礎之類介面操作符過載相關

舉個例子,可以用操作符過載讓某個類的物件之間可以使用加減法操作。當然只要你高興,也可以讓類的物件和整數加減乘除什麼的都是可以的。

dart基礎之類介面操作符過載相關


10.抽象類

和java類似,dart中抽象類也是可以定義無實現的抽象方法。同時,抽象類也不可以例項化,除非定義工廠方法並返回子類,這裡定義工廠方法是為了不讓構造方法返回自身,因為自身是不可初始化的,具體的程式碼如下:

dart基礎之類介面操作符過載相關


11.介面

在java中介面是用interface關鍵字宣告,但是dart中不需要任何宣告,任一個類都可以作為介面。當需要把某個類當做介面來實現時,只需要使用implements。dart中同一個類也可以實現多個介面,和java中一樣必須複寫父介面中的所有方法。如果父類中的方法被子類所實現,那麼父類中的方法是不會執行的。介面和繼承另一個區別是在繼承中可以有選擇性的複寫父類中的方法,但是實現介面必須複寫所有方法。

dart基礎之類介面操作符過載相關


12.可呼叫的類

在dart中如果某類中有call方法,可以直接把類當做方法類呼叫,呼叫時執行類中的call方法。如下例,c為Closure物件,但是可以直接通過物件名的方法來呼叫call方法。這裡由於初始化類時也需要傳2個字串,並且可以省略new關鍵字,就出現了以下的2組引數的情況,哈哈是不是很好玩呢?

dart基礎之類介面操作符過載相關


13.混合機制mixins

mixins機制類似於多繼承,可以使用'with'關鍵字將多個類中的方法混合到一起,供混合類來呼叫,這又是一個新玩法。需要注意的是,被混合的父類中不允許有構造方法。以下為一個最簡單的mixins例項,C類是由A、B混合而成,所以C的物件可以呼叫A中的a方法。

dart基礎之類介面操作符過載相關

特性一  如果被混合的多個類中含有相同的方法,則呼叫最後被混淆的那個

如下圖,C類是由A類和B類混淆而成,然後A類和B類中都有a( ),最後用C類物件來呼叫a(),最後的結果是輸出B,因為在混合時B比A更後面混合,所以呼叫B的。

dart基礎之類介面操作符過載相關

特性二  如果被混合的類中含有的方法在混合類中本身存在,則呼叫混合類本身的方法。

在下圖中,由於混合類C中本身就定義了a( ),所以最後呼叫的是C中的a( )。

dart基礎之類介面操作符過載相關

特性三  混合類和繼承是相容的,二者結合還有特殊的寫法

在下圖中,AB類繼承自P,然後混合了A類和B類,其中P類、A類、B類中都有相同的getMessage方法,最後在混合後的AB類中呼叫getMessage方法,最終執行到的是B類中的getMessage方法,原因是B類是最後混合的,其他2個類的都被B類中的覆蓋了。需要注意的是,extends必須寫在with前面,這也說明了被繼承中的類中的方法只能被覆蓋,不能覆蓋被混合的類中的同名方法了。

dart基礎之類介面操作符過載相關

混合類的使用場景:因為繼承只能有一個父類,不能支援同時呼叫多個父類中的方法。而介面的話就必須實現所有的方法,但有時候我們想直接使用很多父類中的方法,而不想複寫時就可以用到混合類,使程式碼變得相當實用簡潔。如下圖,person1想使用swimming方法和jump方法,所以必須繼承swimming並且實現jump,最坑的是需要實現jump方法,而我們並不想修改jump的實現,雖然改完以後可以達到目的,但是未免顯得繁瑣,裡面寫了很多無用程式碼。再看看person2類直接with Swimming,Jump就搞定了,是不是簡潔很多?

dart基礎之類介面操作符過載相關

總結:本文分享了一下dart中有關類(物件)、抽象類、介面、混合、操作符過載等機制中和java不一樣的地方,感覺dart中還是有很多人性化的地方,程式碼更加的簡潔,而且比較容易上手。也難怪,dart的野心是替代js的地位,有這種種考慮也是底氣的一部分。當然,dart中好玩的地方遠遠不止如此,後面會繼續給大家分享,希望對大家有所幫助。


相關文章