Дротик: миксин без расширения
Я понимаю, что дартс миксин не должен расширять другие классы. Тем не менее, есть ли какой-нибудь способ создать композицию из двух миксов, которая не использует экстент? Например, рассмотрим следующий код
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 в качестве миксина, он не может расширять GreeterMixin. К сожалению, это означает, что везде, где я включаю SmallTalkerMixin в качестве миксина, я также должен включать GreeterMixin в качестве миксина.
Другими словами, есть ли способ добиться следующего, используя только код выше?
abstract class SmallTalkerGreeterMixin implements SmallTalkerMixin, GreeterMixin{
sayHello(String person) => print("Hello $person");
makeSmallTalk(String person){
sayHello(person);
print("The weather looks good");
}
}
2 ответа
Я не думаю, что это в настоящее время возможно. Предполагается, что многие ограничения по миксинам будут сняты, но нет конкретных сроков, пока это не произойдет.
Вы можете создать класс, подобный тому, о котором вы просите, но он не будет использоваться как миксин.
class SmallTalkerGreeterMixin = SmallTalkerMixin with GreeterMixin;
или, что эквивалентно,
class SmallTalkerGreeterMixin = Object with SmallTalkerMixin, GreeterMixin;
Это создает класс, который вы запрашиваете, но так как его суперкласс либо SmallTalkerMixin
или же Object with SmallTalkerMixin
не Object
Вы не можете использовать его как миксин.
При нынешних ограничениях невозможно объединить два миксина в один класс, который можно снова использовать в качестве миксина - все миксины должны иметь Object
как супертип, и вы не можете добавить функциональность двух классов и по-прежнему Object
как супертип.
Одна из идей миксина заключается в том, что он относится только к постепенному изменению между классом и его суперклассом. Все классы определены как суперкласс, расширенный другим слоем поверх него. Применение класса mixin - это способ повторного использования расширения, где обычные объявления классов - это только способ повторного использования суперкласса. Поскольку миксин представляет собой только один слой, невозможно объединить два миксина в один.
Это, безусловно, будет полезной функцией, хотя. Если вы посмотрите на ListMixin
класс, он дублирует некоторые функции IterableMixin
, Было бы гораздо лучше, если бы можно было IterableMixin
и все же иметь результат, который можно использовать как миксин, но в настоящее время это невозможно.