2013-05-09 68 views
1

Dart中是否內置了使其具有可執行類型的功能?如何在Dart中實現可執行類型

在我的JavaScript應用程序我使用了一個名爲Eventable類提供以下功能:在JavaScript

var dog = new Dog() //where Dog inherits from Eventable 
var cat = new Cat() //where Cat inherits from Eventable 

//use 'on' to listen to events 
cat.on(dog, 'bark', cat.runaway); //assuming Cat has a method runaway on its prototype 

//use fire to launch events 
dog.fire({type: 'bark'}); //this causes cat.runaway(event); to be called 

一個很常見的模式,我喜歡它,因爲它可以幫助我保持在src和孤立的對象我腦海。

使用on方法創建new EventContract具有(以上'bark')基於所述所有者(cat以上),客戶端(dog以上)的唯一密鑰,類型和功能(cat.runaway上文)。這種獨特的鍵允許我以確保不會重複EventContract s的創建,但更重要的是它讓我保持一個易於查找所有EventContract的系列S對象有,這樣,我可以打電話:

cat.dispose(); 

cat的所有事件合約都將被銷燬,所以我相信所有對貓的外部引用都已被刪除,貓現在可以GC'd。

但我發現很難實現達特這個功能,因爲這樣做是這樣的:cat.on(dog, 'bark', cat.runaway);導致生成一個新的功能,以包圍(){cat.runaway();}和唯一的唯一密鑰,我可以在鏢下車標準函數對象的是它的hashCode,但這意味着我可以記住cat.on(dog, 'bark', cat.runaway);,它會創建一個新的EventContract,因爲它創建了另一個獨特的閉包,而不是處理對原始函數的引用,就像在javascript中發生的那樣。

對我來說有沒有辦法在飛鏢中實現這種模式?

回答

7

一般而言,您應該使用Stream作爲慣用方式來提供Dart中的一系列事件。此外,最好是有來源exlpicitly聲明(例如onBark代替on['bark']這樣的事情應該讓你開始活動。

class Dog { 
    var _barkController = new StreamController(); 
    Stream get onBark => _barkController.stream.asBroadcastStream(); 
    void bark() => _barkController.add("woof"); 
} 

class Cat { 
    void runaway() => print("cat running"); 
} 

void main() { 
    var dog = new Dog(); 
    var cat = new Cat(); 

    // listen returns subscription object which you can use to unsubscribe 
    var sub = dog.onBark.listen((event) => cat.runaway()); 

    dog.bark(); // prints 'cat running' 
    sub.cancel(); 
    dog.bark(); // doesn't print anything 
} 

,如果您願意讓事件動態地宣佈,你可以有這樣的事情:

var sub = dog.on['bark'].listen((event) => cat.runaway()); 
    // in this case `on` is a property of some Events type which overrides 
    // operator[] to return appropriate Stream 

已經有類似的Events class,用於提供對DOM元素瀏覽器事件

此外,還有社區圖書館。和event_source,它簡化了這項任務。

+0

謝謝你非常有幫助 – 0xor1 2013-05-09 18:54:57

+0

當然,這是一個屬性訪問器:http://www.dartlang.org/articles/idiomatic-dart/#fields-getters-and-setters – 2013-05-10 20:53:57

+0

謝謝文章鏈接是我正在尋找 – 0xor1 2013-05-10 21:23:04

相關問題