如何在Dart中利用Map方法标准化抽象类子类的clone逻辑?
统一抽象类子类的Clone实现方案
要确保所有子类的克隆逻辑完全一致,你可以在抽象类中统一实现clone方法,同时要求子类实现一个从Map创建实例的标准化方法,避免每个子类重复编写克隆逻辑。
修改后的抽象类结构
abstract class ParentClass<T extends ParentClass<T>> { String foo; int bar; ParentClass({ String? foo, int? bar, Map? kwargs, }) : foo = foo ?? kwargs?['foo'] ?? "Not provided", bar = bar ?? kwargs?['bar'] ?? 0; Map<String, dynamic> toMap(); // 子类必须实现:从Map创建当前类型的实例 T fromMap(Map<String, dynamic> map); // 父类统一实现clone逻辑,子类无需重写 T clone() => fromMap(toMap()); }
子类实现示例
class ChildClass extends ParentClass<ChildClass> { String x; ChildClass({ super.foo, super.bar, required this.x, Map? kwargs, }) : x = kwargs?['x'] ?? ''; @override Map<String, dynamic> toMap() { return { 'foo': foo, 'bar': bar, 'x': x, }; } @override ChildClass fromMap(Map<String, dynamic> map) { // 直接复用子类的kwargs构造函数,符合你期望的形式 return ChildClass(kwargs: map); } }
方案优势
- 克隆逻辑完全统一:所有子类的
clone行为由父类控制,子类无法篡改克隆逻辑,避免后续出现差异。 - 子类实现简单:只需要实现
toMap和fromMap,其中fromMap直接复用自身的kwargs构造函数,契合你理想的克隆形式。 - 扩展性强:如果后续需要调整克隆逻辑,仅修改父类的
clone方法即可,无需逐个修改子类。
内容的提问来源于stack exchange,提问作者Jimmy Donovan
相关产品推荐
相关产品推荐

