飞镖:没有延伸的mixin组合物

时间:2015-01-02 22:32:47

标签: dart mixins

我知道Dart mixins不能扩展其他类。但是,是否有某种方法可以以某种方式创建两个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作为mixin包含在内,我还必须将GreeterMixin作为mixin包含在内。

换句话说,有没有办法只使用上面的代码来实现以下内容?

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

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

2 个答案:

答案 0 :(得分:1)

我认为目前无法做到这一点。 mixin的许多限制应该被删除,但是直到发生这种情况时才会有特定的时间框架。

答案 1 :(得分:1)

您可以创建一个类似于您要求的类,但它不能用作mixin。

class SmallTalkerGreeterMixin = SmallTalkerMixin with GreeterMixin;

或等同地

class SmallTalkerGreeterMixin = Object with SmallTalkerMixin, GreeterMixin;

这会创建您要求的课程,但由于其超类是SmallTalkerMixinObject with SmallTalkerMixin,而不是Object,因此您无法将其用作混音。

根据当前的限制,没有办法将两个mixin组合成一个类,它可以再次用作mixin - 所有mixin必须有Object作为超类型,并且你不能添加两个功能类仍然有Object作为超类型。

mixin的一个想法是它只将引用到类及其超类之间的增量变化。所有类都被定义为一个超类,在其上面有另一个层。应用mixin类是重用扩展的一种方法,其中普通类声明只是重用超类的一种方法。由于mixin只有一层,因此无法将两个mixin合并为一个。

但这绝对是一个有用的功能。如果查看ListMixin类,它会复制IterableMixin的某些功能。如果可以扩展IterableMixin并且仍然可以将结果用作mixin,那会好得多,但目前还不可能。