【问题标题】:Dart: mixin composition without extensionDart:没有扩展的mixin组合
【发布时间】:2015-01-02 22:32:47
【问题描述】:

我理解 Dart 的 mixin 不能扩展其他类。但是,是否有某种方法可以以某种不使用扩展的方式创建两个 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 必须是 greeter,但是因为我想使用 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");
  }
}

【问题讨论】:

    标签: dart mixins


    【解决方案1】:

    我认为目前这是不可能的。 mixin 的许多限制都应该被移除,但没有具体的时间框架,直到何时才会发生。

    【讨论】:

      【解决方案2】:

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

      class SmallTalkerGreeterMixin = SmallTalkerMixin with GreeterMixin;
      

      或者,等价的,

      class SmallTalkerGreeterMixin = Object with SmallTalkerMixin, GreeterMixin;
      

      这会创建您要求的类,但由于它的超类是 SmallTalkerMixinObject with SmallTalkerMixin,而不是 Object,因此您不能将其用作 mixin。

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

      mixin 的一个想法是它指代一个类和它的超类之间的增量变化。所有类都被定义为一个超类,在其上扩展了另一层。应用 mixin 类是重用 extension 的一种方式,而普通的类声明只是重用超类的一种方式。由于mixin只有一层,所以没有办法将两个mixin合二为一。

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

      【讨论】:

      • 我不同意(这不能回答问题)。这不是我所希望的答案,但我问了一个是/否的问题,得到了一个否定的回答。没关系。我建议它不会进一步增加 Gunter 的任何内容 - 但来自其他来源的验证绝不是一件坏事 :)
      • 我已经详细阐述了答案。答案仍然是“不”。如果/当情况发生变化时,我将是第一个使用该功能的人:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多