我知道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");
}
}
答案 0 :(得分:1)
我认为目前无法做到这一点。 mixin的许多限制应该被删除,但是直到发生这种情况时才会有特定的时间框架。
答案 1 :(得分:1)
您可以创建一个类似于您要求的类,但它不能用作mixin。
class SmallTalkerGreeterMixin = SmallTalkerMixin with GreeterMixin;
或等同地
class SmallTalkerGreeterMixin = Object with SmallTalkerMixin, GreeterMixin;
这会创建您要求的课程,但由于其超类是SmallTalkerMixin
或Object with SmallTalkerMixin
,而不是Object
,因此您无法将其用作混音。
根据当前的限制,没有办法将两个mixin组合成一个类,它可以再次用作mixin - 所有mixin必须有Object
作为超类型,并且你不能添加两个功能类仍然有Object
作为超类型。
mixin的一个想法是它只将引用到类及其超类之间的增量变化。所有类都被定义为一个超类,在其上面有另一个层。应用mixin类是重用扩展的一种方法,其中普通类声明只是重用超类的一种方法。由于mixin只有一层,因此无法将两个mixin合并为一个。
但这绝对是一个有用的功能。如果查看ListMixin
类,它会复制IterableMixin
的某些功能。如果可以扩展IterableMixin
并且仍然可以将结果用作mixin,那会好得多,但目前还不可能。