2015-01-02 45 views
1

我知道Dart mixin不能擴展其他類。但是,是否有某種方法可以通過某種不使用擴展的方式創建兩個mixin組合?例如,請考慮下面的代碼Dart:無擴展名的mixin組合

abstract class GreeterMixin{ 
    sayHello(String person) => print("Hello $person"); 
} 

abstract class SmallTalkerMixin implements GreeterMixin{ 
    makeSmallTalk(String person){ 
    sayHello(person); 
    print("The weather looks good"); 
    } 
} 

class Animal{ 
    final int nLegs; 
    Animal(this.nLegs); 
} 

class Person extends Animal{ 
    final String name; 
    Person(this.name): super(2); 
} 

class SocialPerson extends Person with GreeterMixin, SmallTalkerMixin{ 
    SocialPerson(String name): super(name); 

    introduceSelf(String person){ 
    makeSmallTalk(person); 
    print("My name is $name"); 
    } 
} 

顯然,smallTalker必須是招待員,而是因爲我想用SmallTalkerMixin作爲一個mixin,它不能擴展GreeterMixin。不幸的是,這意味着我在任何地方都將SmallTalkerMixin作爲混音使用,我還必須將GreeterMixin作爲混音使用。

換句話說,有沒有辦法使用上面的代碼來實現以下目標?

abstract class SmallTalkerGreeterMixin implements SmallTalkerMixin, GreeterMixin{ 
    sayHello(String person) => print("Hello $person"); 

    makeSmallTalk(String person){ 
    sayHello(person); 
    print("The weather looks good"); 
    } 
} 

回答

1

我不認爲這是現在可能的。 mixin的許多限制應該被刪除,但是直到這種情況發生時纔會有特定的時間框架。

1

你可以創建一個類似你所要求的類,但它不能用作混合類。

class SmallTalkerGreeterMixin = SmallTalkerMixin with GreeterMixin; 

,或者等價地,

class SmallTalkerGreeterMixin = Object with SmallTalkerMixin, GreeterMixin; 

這將創建你問的類,但由於它的父類或者是SmallTalkerMixinObject with SmallTalkerMixin,不Object,你不能把它作爲一個mixin。

由於目前的限制,沒有辦法將兩個mixin合併到一個類中,它可以再次用作混合類型 - 所有的mixins都必須有Object作爲超類型,並且不能添加兩個類的功能,並且仍然有Object作爲超類型。

mixin的一個想法是,它指只有到類和它的超類之間的增量變化。所有類都被定義爲一個超類,並在其上層增加另一層。應用mixin類是重用擴展的一種方法,其中常規類聲明只是重用超類的一種方式。由於mixin只有一層,因此無法將兩個mixin合併爲一個。

這絕對是一個有用的功能,但。如果您查看ListMixin課程,它將複製IterableMixin的某些功能。如果可以擴展IterableMixin並且仍然可以將結果作爲混合使用,那將會好得多,但這目前不可能。

+0

我不同意(這不能回答這個問題)。這不是我希望的答案,但我問了一個是/否的問題,並沒有得到任何迴應。沒關係。我建議它不會添加任何更多的Gunter的 - 但來自其他來源的驗證永遠不會是一件壞事:) – DomJack

+0

我已經闡述了更多的答案。答案仍然是「不」。如果/當這種變化,我會成爲第一個使用該功能的人:) – lrn