Dart 使用现有 Map 方法标准化子类克隆方法的逻辑

问题描述 投票:0回答:1

我正在尝试标准化 class.clone 方法的逻辑,以便我的抽象类的每个子级都以完全相同的方式进行克隆。

我尝试过使用工厂构造函数和各种迂回方式,但我似乎找不到一种不需要添加专门用于克隆的附加功能的解决方案,我觉得这是多余的,并且让我在如何实现方面遇到了不必要的差异克隆可以顺利进行。

类结构如下:

abstract class ParentClass<T extends ParentClass<T>> {
  String foo;
  int bar;

  Model({
    String? foo,
    int? bar
    Map? kwargs,
  })  : foo = foo ?? kwargs?['foo'] ?? "Not provided",
        bar = bar ?? kwargs?['bar'] ?? 0;

  Map<String, dynamic> toMap();
  // toMap always returns approximately {'foo':foo1, 'bar':bar1, "x":x1, etc.}

  T clone();
  //Optimally along the lines of T clone() => T(kwargs:toMap())
}
flutter dart inheritance constructor cloning
1个回答
0
投票

为了标准化抽象类

clone
的每个子代的
ParentClass
方法,您可以使用一种称为“复制构造函数”模式的模式。此模式涉及向抽象类添加一个构造函数,该构造函数采用同一类的实例作为参数,并根据所提供实例的属性创建一个新实例。以下是在代码中实现它的方法:

abstract class ParentClass<T extends ParentClass<T>> {
  String foo;
  int bar;

  ParentClass({
    String? foo,
    int? bar,
    Map<String, dynamic>? kwargs,
  })  : foo = foo ?? kwargs?['foo'] ?? "Not provided",
        bar = bar ?? kwargs?['bar'] ?? 0;

  Map<String, dynamic> toMap();

  T clone();

  // Copy constructor
  ParentClass.copy(ParentClass<T> other)
      : foo = other.foo,
        bar = other.bar;

  T clone() {
    // Use the copy constructor to create a new instance with the same properties
    return T.copy(this);
  }
}

通过此实现,您已向抽象类添加了一个复制构造函数

ParentClass
。此复制构造函数采用同一类的实例作为参数,并使用所提供实例的属性初始化新实例。抽象类中的
clone
方法现在只需调用此复制构造函数即可创建具有相同属性的相同类型的新实例。

现在,当您创建

ParentClass
的子类时,它们将继承
clone
方法并使用复制构造函数以标准化方式创建克隆。您不需要在每个子类中实现
clone
方法,因为它已经由父类提供了。

© www.soinside.com 2019 - 2024. All rights reserved.