Dart 如何在没有继承的情况下使用mixin?
在目标类不从任何其他类继承的情况下,是否可以对类应用mixin?例如,我是否可以实现以下功能:Dart 如何在没有继承的情况下使用mixin?,dart,mixins,Dart,Mixins,在目标类不从任何其他类继承的情况下,是否可以对类应用mixin?例如,我是否可以实现以下功能: class User with Persistence { // implementation } dart中的大多数mixin示例似乎都与继承相结合 提前谢谢 如果要使用mixin,必须从另一个类继承。但是,您可以简单地从对象继承: 类用户使用持久性扩展对象{ //实施 } 但实际上,您也可以从持久性继承,这将产生相同的效果: 类用户扩展持久性{ //实施 } Gilad Bracha认为
class User with Persistence {
// implementation
}
dart中的大多数mixin示例似乎都与继承相结合
提前谢谢 如果要使用mixin,必须从另一个类继承。但是,您可以简单地从对象继承:
类用户使用持久性扩展对象{
//实施
}
但实际上,您也可以从持久性继承,这将产生相同的效果:
类用户扩展持久性{
//实施
}
Gilad Bracha认为语法是专门设计的:
我认为理解这里的语义模型很重要。“与”
是mixin应用程序操作符,它接受两个参数:a
超类和一个mixin,并生成一个类。在英语中说“和福在一起”
隔离就像说>>2一样有意义(你可以同时解释两者)
作为curried函数,但这与Dart相差甚远)。当你写作时
“C用M扩展S”,则在
extends关键字,就像编写“C extends K”时一样,除了
超类不是通过标识符指定的,而是通过mixin指定的
应用所以超类应该是“S加M”
正如Lasse指出的,作为一个实际问题,它并不限制你,但是
让语法反映底层结构很重要
根据Gilad的解释,如果
with
是一个操作符,那么将超类和一个mixin作为操作数并返回一个新类的,那么代码类C用M扩展s
将等同于类C扩展(s用M)
好像说C
扩展了一个类,这个类是M
与S
混合的结果。我被混合弄糊涂了,@lrn给了我这个解释,这也是一个有用的观点。然而,我的问题是,如果不考虑从超级类扩展到目标类,我就不能混入类中@Pixel Elephant建议在需要时扩展对象
,这可以帮助我做到这一点。Gilad的解释完全正确。您可以认为Dart只有一个混入操作,class X=Y和Z代码>,其他一切都可以简化为该代码。当你有类C扩展D与E这真的是类DwithE=D加E;C类使用…
扩展数据。当你有。。。D和E,F…
,实际上是类DwithE=D和E;类DwithEF=DwithE和F。。。DwithEF…
。您可以内联编写“类C扩展了D,带有E,F{”,但它确实引入了两个额外的匿名类,超类链是DwithEF
,DWithE
,D
,Object
。