我正在尝试构建一个基类 Table< T > ,它使用列表 TableColumns< T > 在 Dart 中显示表格。在 Java 中,这可以通过匿名类模式来完成,其中叶类看起来如下简单:
class PartTable extends Table< Part > {
// Column 1: Part Number
addColumn( new TableColumn<Part>("Part Number") {
String get(Part part) { part.getNumber().toString() }
void set(Part part, String number) {
part.setNumber(number);
}
});
// Column 2: Part Description
addColumn( new TableColumn<Part>("Part Description") {
String get(Part part) { part.getDescription().toString() }
void set(Part part, String desc) {
part.setDescription(desc);
}
});
}
有人可以建议一种 Dart 设计模式来很好地替代上面的 Java 匿名类模式吗?基本思想是,匿名 TableColumn 类抽象方法(例如 get 和 set)由 Table 构造函数中的匿名类覆盖,以提供用于处理部件属性的 View 特定覆盖。因此,表可以具有任意数量的列,并为表单元格中的每个部分属性提供 View 特定的 CRUD 行为。
最佳答案
我认为您的问题没有通用答案。这实际上取决于您的代码。您可以为所有匿名类创建一个类,或者重构您的 API 并尝试避免它们。
例如,您的示例代码可以重构为使用函数来定义 get
/set
:
final table = new Table<Part>()
..addColumn(new Column<Part>(
"Part Number",
(p) => p.number.toString(),
(p, s) => p.number = s))
..addColumn(new Column<Part>(
"Part Description",
(p) => p.desc.toString(),
(p, s) => p.desc = s));
下面是底层代码:
typedef String ColumnGetter<T>(T t);
typedef void ColumnSetter<T>(T t, String s);
class Column<T> {
final String name;
final ColumnGetter<T> get;
final ColumnSetter<T> set;
Column(this.name, this.get, this.set);
}
class Table<T> {
List<T> _elements;
final _columns = [];
void addColumn(Column<T> column) => _columns.add(column);
void set elements(List<T> elements) {
this._elements = elements;
// updateDisplay
}
}
关于design-patterns - Dart 中匿名类的替换模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18602268/