dart基礎之類接口操做符重載相關

Dart是一門面向對象語言,和java同樣,全部的類都繼承自Object。可是也有不少不同的地方,好比對構造函數的支持、操做符重載等新玩法,本次介紹一下dart中的新玩法。java


1.類中省略不少關鍵字緩存

在建立對象時能夠省略new關鍵字,直接Class()就能夠建立了。而後類中方法返回值也能夠省略,省略後就是dynamic類型,在實際運行時肯定實際類型。函數


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

在java中有private關鍵字表明私有,可是dart中並無private關鍵字,而是規定如下劃線_開頭的類、方法、屬性做爲私有,對其餘文件不可見。在dart中沒有protected概念,只要不如下劃線開頭就是表明公有。code


3.構造函數語法糖cdn

在實際的開發中,常常在構造函數中給類中的變量賦值,並且寫的代碼都是千篇一概毫無養分。在dart中能夠對該狀況進行簡寫,不須要大括號均可以搞定。以下,咱們在A類中定義好了給x、y屬性賦值的最簡方式,注意,參數必定要this.開頭,否則運行是會報錯的,由於沒實現體,只有this.開頭的參數才能夠不寫實現,系統自動給實現成給屬性賦值。而後還有一個注意點,這裏面的參數必定要寫全,好比寫成A(this.x)也會報錯的。對象


4.命名構造函數blog

構造函數重載在java中是經常使用的,好比自定義view中須要同時寫3個構造函數。 Dart 並不支持構造函數的重載,而採用了命名構造函數爲一個類實現多個構造函數。在dart中構造方法名能夠修改成和實際業務相關,好比a功能調用A.a( )構造方法,b功能調用A.b( )構造方法。繼承


5.重定向構造方法接口

能夠在構造方法上使用:this來重定向,調用該構造方法之後,至關因而調用另外的構造方法。須要注意的是,在java中是在方法體中使用this()的方式,dart中是不支持的。


6.常量構造方法

若是你的類提供一個狀態不變的對象,你能夠把這些對象 定義爲編譯時常量。要實現這個功能,須要定義一個 const 構造函數, 而且聲明全部類的變量爲final


7.工廠構造方法

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


利用這一特性,能夠用工廠構造方法實現單例,dart中的單例和java中的相似,私有化構造方法,記錄對外getInstance方法,在getInstance中建立對象而且返回。提示一下固然和java的實現方式同樣,不使用這個構造方法,而是用一個static getInstance方法也是能夠實現的。


8.getter和setter

這個有點意思,將某個新屬性和類中其餘屬性創建關係,每當該屬性變化時,能夠直接給其餘屬性賦值。至關因而Java中首先定義了一個right變量,而後再變量的set中寫好left=value-width,在get中寫好right=left+width,可是dart中直接簡寫了。


9.操做符重載

dart是支持操做符重載的,能夠將系統支持的操做符進行重載,賦予其另外的功能,目前dart中能夠重載的操做符以下:

舉個例子,能夠用操做符重載讓某個類的對象之間可使用加減法操做。固然只要你高興,也可讓類的對象和整數加減乘除什麼的都是能夠的。


10.抽象類

和java相似,dart中抽象類也是能夠定義無實現的抽象方法。同時,抽象類也不能夠實例化,除非定義工廠方法並返回子類,這裏定義工廠方法是爲了避免讓構造方法返回自身,由於自身是不可初始化的,具體的代碼以下:


11.接口

在java中接口是用interface關鍵字聲明,可是dart中不須要任何聲明,任一個類均可以做爲接口。當須要把某個類當作接口來實現時,只須要使用implements。dart中同一個類也能夠實現多個接口,和java中同樣必須複寫父接口中的全部方法。若是父類中的方法被子類所實現,那麼父類中的方法是不會執行的。接口和繼承另外一個區別是在繼承中能夠有選擇性的複寫父類中的方法,可是實現接口必須複寫全部方法。


12.可調用的類

在dart中若是某類中有call方法,能夠直接把類當作方法類調用,調用時執行類中的call方法。以下例,c爲Closure對象,可是能夠直接經過對象名的方法來調用call方法。這裏因爲初始化類時也須要傳2個字符串,而且能夠省略new關鍵字,就出現瞭如下的2組參數的狀況,哈哈是否是很好玩呢?


13.混合機制mixins

mixins機制相似於多繼承,可使用'with'關鍵字將多個類中的方法混合到一塊兒,供混合類來調用,這又是一個新玩法。須要注意的是,被混合的父類中不容許有構造方法。如下爲一個最簡單的mixins實例,C類是由A、B混合而成,因此C的對象能夠調用A中的a方法。

特性一  若是被混合的多個類中含有相同的方法,則調用最後被混淆的那個

以下圖,C類是由A類和B類混淆而成,而後A類和B類中都有a( ),最後用C類對象來調用a(),最後的結果是輸出B,由於在混合時B比A更後面混合,因此調用B的。


特性二  若是被混合的類中含有的方法在混合類中自己存在,則調用混合類自己的方法。

在下圖中,因爲混合類C中自己就定義了a( ),因此最後調用的是C中的a( )。


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

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


混合類的使用場景:由於繼承只能有一個父類,不能支持同時調用多個父類中的方法。而接口的話就必須實現全部的方法,但有時候咱們想直接使用不少父類中的方法,而不想複寫時就能夠用到混合類,使代碼變得至關實用簡潔。以下圖,person1想使用swimming方法和jump方法,因此必須繼承swimming而且實現jump,最坑的是須要實現jump方法,而咱們並不想修改jump的實現,雖然改完之後能夠達到目的,可是未免顯得繁瑣,裏面寫了不少無用代碼。再看看person2類直接with Swimming,Jump就搞定了,是否是簡潔不少?


總結:本文分享了一下dart中有關類(對象)、抽象類、接口、混合、操做符重載等機制中和java不同的地方,感受dart中仍是有不少人性化的地方,代碼更加的簡潔,並且比較容易上手。也難怪,dart的野心是替代js的地位,有這種種考慮也是底氣的一部分。固然,dart中好玩的地方遠遠不止如此,後面會繼續給你們分享,但願對你們有所幫助。

相關文章
相關標籤/搜索