Dart:没有扩展的mixin组合
Dart: mixin composition without extension
我了解 Dart 混入不能扩展其他类。但是,有没有办法以某种不使用扩展的方式创建两个混入的组合?例如,考虑以下代码
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");
}
}
我认为目前这不可能。 mixin 的许多限制应该会被移除,但没有具体的时间框架,直到这会发生。
您可以像您所要求的那样创建一个 class,但它不能用作 mixin。
class SmallTalkerGreeterMixin = SmallTalkerMixin with GreeterMixin;
或者,等价地,
class SmallTalkerGreeterMixin = Object with SmallTalkerMixin, GreeterMixin;
这将创建您要求的 class,但由于它的超级 class 是 SmallTalkerMixin
或 Object with SmallTalkerMixin
,而不是 Object
,您可以'不要将它用作混音。
由于当前的限制,无法将两个混入组合成一个 class 可以再次用作混入 - 所有混入必须具有 Object
作为超类型,并且您可以' t 添加两个 classes 的功能并且仍然有 Object
作为超类型。
mixin 的一个想法是它仅 指class 和它的超级class 之间的增量变化。所有 classes 都被定义为一个 superclass 扩展,并在其之上扩展了另一层。应用 mixin class 是重用 extension 的一种方式,其中正常的 class 声明只是重用 superclass 的一种方式。由于一个mixin只有一层,所以没有办法将两个mixin合二为一
虽然这绝对是一个有用的功能。如果您查看 ListMixin
class,它会重复 IterableMixin
的某些功能。如果可以扩展 IterableMixin
并且仍然可以将结果用作 mixin,那就更好了,但目前这是不可能的。
我了解 Dart 混入不能扩展其他类。但是,有没有办法以某种不使用扩展的方式创建两个混入的组合?例如,考虑以下代码
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");
}
}
我认为目前这不可能。 mixin 的许多限制应该会被移除,但没有具体的时间框架,直到这会发生。
您可以像您所要求的那样创建一个 class,但它不能用作 mixin。
class SmallTalkerGreeterMixin = SmallTalkerMixin with GreeterMixin;
或者,等价地,
class SmallTalkerGreeterMixin = Object with SmallTalkerMixin, GreeterMixin;
这将创建您要求的 class,但由于它的超级 class 是 SmallTalkerMixin
或 Object with SmallTalkerMixin
,而不是 Object
,您可以'不要将它用作混音。
由于当前的限制,无法将两个混入组合成一个 class 可以再次用作混入 - 所有混入必须具有 Object
作为超类型,并且您可以' t 添加两个 classes 的功能并且仍然有 Object
作为超类型。
mixin 的一个想法是它仅 指class 和它的超级class 之间的增量变化。所有 classes 都被定义为一个 superclass 扩展,并在其之上扩展了另一层。应用 mixin class 是重用 extension 的一种方式,其中正常的 class 声明只是重用 superclass 的一种方式。由于一个mixin只有一层,所以没有办法将两个mixin合二为一
虽然这绝对是一个有用的功能。如果您查看 ListMixin
class,它会重复 IterableMixin
的某些功能。如果可以扩展 IterableMixin
并且仍然可以将结果用作 mixin,那就更好了,但目前这是不可能的。