如何在Dart抽象类中统一定义默认值以避免子类重复判空?
Dart抽象类构造函数统一处理默认值方案
问题场景
现有如下抽象类Shape:
abstract class Shape { Path _path = Path(); Color _color = Colors.black; double _strokeWidth = 2; PaintingStyle _paintingStyle = PaintingStyle.stroke; // 注:原构造函数名应为Shape,此处修正笔误 Shape({Color? color, double? strokeWidth}) { _color = color ?? Colors.black; _strokeWidth = strokeWidth ?? 2; } }
以及其子类Circle:
class Circle extends Shape { Circle({ Color? color, required super.offset, required super.size, required double strokeWidth, }) : super() { _color = color ?? Colors.black; // 该行重复判空,希望消除 _path = setPath(); _strokeWidth = strokeWidth; } }
当前每个子类都需要重复进行空值检查,询问是否可通过抽象类构造函数统一定义默认值。
解决方案
完全可以通过抽象类构造函数统一处理默认值,避免子类重复代码,具体修改如下:
1. 优化抽象类Shape的构造函数
调整构造函数,补充子类依赖的属性,同时通过初始化列表直接完成默认值赋值:
abstract class Shape { Path _path = Path(); Color _color = Colors.black; double _strokeWidth = 2; PaintingStyle _paintingStyle = PaintingStyle.stroke; // 补充子类调用的offset、size属性 final Offset offset; final Size size; // 构造函数接收必要参数和可选参数,统一处理默认值 Shape({ required this.offset, required this.size, Color? color, double? strokeWidth, }) : _color = color ?? Colors.black, _strokeWidth = strokeWidth ?? 2; // 定义子类需实现的路径生成方法 Path setPath(); }
2. 简化子类Circle的构造函数
子类只需将参数传递给父类构造函数,无需重复处理空值逻辑:
class Circle extends Shape { Circle({ Color? color, required super.offset, required super.size, required double strokeWidth, }) : super( color: color, strokeWidth: strokeWidth, ) { _path = setPath(); } @override Path setPath() { // 实现Circle的路径绘制逻辑 return Path() ..addOval(Rect.fromCircle( center: offset, radius: size.width / 2, )); } }
核心说明
- 父类通过初始化列表完成默认值赋值,比构造函数体内赋值更高效,且逻辑集中统一。
- 子类调用
super()时传递对应参数,父类会自动处理空值判断,子类无需重复编写_color = color ?? Colors.black这类冗余代码。 - 子类若有必填参数(如示例中的
strokeWidth),直接传递给父类即可,不影响父类可选参数的默认值逻辑。
内容的提问来源于stack exchange,提问作者Thuận Phạm
相关产品推荐
相关产品推荐

