Mixins in Dart: как их использовать - PullRequest
0 голосов
/ 02 сентября 2018

Итак, я пытаюсь создать простую небольшую программу, в которой я использую миксины. Я хочу представить книжный магазин и иметь два товара (книги, сумки) ... но я хочу, чтобы абстрактный класс вверху (Com) определял методы, которые можно применять ко всем товарам (объектам) без изменения отдельных классов. Однако я понятия не имею, как это реализовать. Этот метод может быть таким же простым, как отслеживание, если в книжном магазине находится определенная книга.

Вот мой текущий код:

abstract class Com {
not sure not sure
}


class Product extends Object with Com {
String name;
double price;
Product(this.name, this.price);
}

class Bag extends Product {
String typeofb;
Bag(name, price, this.typeofb) :super(name, price);
}

class Book extends Product {

String author;
String title;
Book(name, price, this.author, this.title):super(name, price);
}

void main() {
var b = new Book('Best Book Ever', 29.99,'Ed Baller & Eleanor Bigwig','Best 
Book Ever');

 }

1 Ответ

0 голосов
/ 02 сентября 2018

Дартс-миксин в настоящее время представляет собой просто набор членов, которые вы можете скопировать поверх других определений классов. Это похоже на наследование реализации (extends) за исключением того, что вы расширяете суперкласс, но расширяете с помощью миксина. Поскольку у вас может быть только один суперкласс, mixins позволяет вам другим (и гораздо более ограниченным) способом поделиться реализацией, который не требует, чтобы суперкласс знал о ваших методах.

То, что вы здесь описываете, звучит как что-то, с чем можно справиться, используя обычный суперкласс. Просто поместите методы в Product и позвольте Bag и Book оба расширить этот класс. Если у вас нет подкласса Product, для которого не нужны методы mixin, нет никаких оснований не включать их в класс Product для начала.

Если вы хотите использовать миксин, вы можете написать что-то вроде:

abstract class PriceMixin {
  String get sku;
  int get price => backend.lookupPriceBySku(sku);
}
abstract class Product {
  final String sku;
  Product(this.sku); 
}
class Book extends Product with PriceMixin {  
  final String title;
  Product(String sku, this.title) : super(sku);
}
class Bag extends Product with PriceMixin {
  final String brand;
  Product(String sku, this.brand) : super(sku);
}
class Brochure extends Product { // No PriceMixin since brochures are free.
  final String name;
  Brochure(String sku, this.name) : super(sku);
}
...