gpt4 book ai didi

Dart:不带扩展的 mixin 组合

转载 作者:行者123 更新时间:2023-12-03 03:13:19 25 4
gpt4 key购买 nike

我知道 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");
}
}

最佳答案

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

class SmallTalkerGreeterMixin = SmallTalkerMixin with GreeterMixin;

或者,等价地,

class SmallTalkerGreeterMixin = Object with SmallTalkerMixin, GreeterMixin;

这将创建您要求的类,但由于其父类(super class)是 SmallTalkerMixinObject with SmallTalkerMixin,而不是 Object,因此您可以'不要将其用作 mixin。

根据当前的限制,无法将两个 mixin 组合成一个类,并可以再次用作 mixin - 所有 mixin 都必须以 Object 作为父类(super class)型,并且您不能添加两个类的功能,并且仍将 Object 作为父类(super class)型。

mixin 的想法之一是它指类与其父类(super class)之间的增量更改。所有类都被定义为父类(super class),并在其之上扩展了另一层。应用 mixin 类是重用扩展的一种方法,而普通类声明只是重用父类(super class)的一种方法。由于 mixin 只有一层,因此无法将两个 mixin 合并为一层。

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

关于Dart:不带扩展的 mixin 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27749406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com