Dart中如何在父类实现子类实例化逻辑,避免子类重复编写copy等公共方法?
Dart 抽象类继承场景下copy方法复用解决方案
你遇到的是Dart抽象类无法实例化、基类直接实现copy会丢失子类类型的典型问题,有3种可行方案可以避免每个子类重复编写copy逻辑:
方案1:抽象copy接口 + 公共逻辑抽离
抽象类只定义方法签名,把参数合并这类通用逻辑抽到基类实现,子类仅需要做自身构造调用即可:
abstract class A { A(this.x, this.y); // 定义抽象copy方法签名 A copy({int? x, int? y}); // 抽离公共的参数合并逻辑,所有子类复用 (int x, int y) mergeParams({int? x, int? y}) => ( x ?? this.x, y ?? this.y ); final int x; final int y; } class B extends A { B(super.x, super.y); @override B copy({int? x, int? y}) { final (nx, ny) = mergeParams(x: x, y: y); return B(nx, ny); } }
后续如果要调整copy的参数处理规则,仅需要修改基类的mergeParams方法即可,所有子类不需要改动。
方案2:泛型+构造回调(完全不用子类重写copy)
如果子类都没有新增属性,仅继承基类的属性,可以用泛型绑定+构造回调的方式,实现copy逻辑100%基类复用:
abstract class A<T extends A<T>> { A(this.x, this.y, this._creator); // 接收子类的构造函数回调 final T Function(int x, int y) _creator; // 基类直接实现copy逻辑 T copy({int? x, int? y}) => _creator(x ?? this.x, y ?? this.y); final int x; final int y; } class B extends A<B> { // 子类仅需要在构造时传入自身构造回调即可 B(int x, int y) : super(x, y, (x, y) => B(x, y)); }
方案3:代码生成(适合大规模项目)
如果子类数量多、且子类各自有额外新增属性,可以用Dart的代码生成工具自动生成所有copy方法,仅需要给类加对应注解即可,完全不用手写重复逻辑,适合中大型项目使用。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

