design-patterns - Dart 中匿名类的替换模式

标签 design-patterns dart anonymous-class

我正在尝试构建一个基类 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/

相关文章:

java - Http 请求调度程序的最佳设计模式?

java - 用于初始化依赖于另一个应用程序 EJB 的 EJB 的模式

class - 此类被标记为 '@immutable',但是其一个或多个实例字段不是最终的:

dart - Dart中的固定宽度格式

flutter - 在 dart 中创建一个包

java - 在 Java 中使用匿名类被认为是不好的风格还是好的?

java - 访问内部类的局部变量需要声明为final

java - 服务到 worker 模式 - 将数据从 Controller 传输到 View 的最佳实践

design-patterns - 开发重构友好代码的最佳实践

java - Java "caching"是匿名类吗?