如何在没有继承的情况下使用Mixins?

cod*_*tix 3 mixins dart

是否可以将mixin应用于类而不从目标类继承任何其他类?例如,我可以实现以下内容:

class User with Persistence {
  // implementation
}
Run Code Online (Sandbox Code Playgroud)

您在飞镖中的大多数Mixins示例似乎都与继承相结合.

提前致谢!

Pix*_*ant 6

如果要使用mixin,则必须从其他类继承.但是,您可以直接从Object继承:

class User extends Object with Persistence {
  // implementation
}
Run Code Online (Sandbox Code Playgroud)

但实际上,你也可以继承Persistence,它具有相同的效果:

class User extends Persistance {
  // implementation
}
Run Code Online (Sandbox Code Playgroud)

Gilad Bracha 解释说语法是这样设计的:

我认为在这里理解语义模型很重要."with"是mixin应用程序运算符,它有两个参数:超类和mixin,并产生一个类.单独说"与Foo"相比,说>> 2(你可以将它们都解释为curried函数,但这与Dart相差很远).当您编写"C extends S with M"时,您正在指定extends关键字后面的超类,就像您编写"C extends K"时所做的那样,除了超类没有通过标识符指定,而是通过mixin应用程序指定.所以超类将是"S with M".

正如Lasse所指出的那样,实际上它不会限制你,但让语法反映底层结构很重要.

  • 对吉拉德的解释完全正确的解释.你可以想到Dart只有一个mixin操作,`class X = Y with Z;`,其他一切都可以减少到那个.当你有'C级用E扩展D ......'时它真的是'DwithE = D与E; C类扩展DwithE ...`.当你有'... D与E,F ......时,它真的是'DwithE = D与E; DwithEF = DwithE与F; ...... DwithEF ......` 您可以编写"C类扩展D与E,F {"内联,但它确实引入了两个额外的匿名类,超类链是`DwithEF`,`DWithE`,`D`,`Object`. (2认同)