Dart继承类实现copyWith()遇覆盖报错,求正确实现方法
解决继承类实现copyWith()方法的报错问题
你遇到的The member being overridden报错,核心原因是子类的copyWith方法签名和基类不兼容,另外子类构造函数未正确初始化基类成员,也是潜在问题。以下是修正方案:
问题分析
- 基类
BaseData的copyWith方法包含id、createdAt、updatedAt三个可选参数,子类QcData的copyWith只定义了name参数,不符合Dart的方法重写规则——重写的方法必须能接收基类方法的所有调用参数。 - 子类
QcData的构造函数没有调用super,导致基类的成员变量未被初始化,会引发额外错误。
修正后的代码
基类(无需修改)
class BaseData { int id; String? createdAt, updatedAt; BaseData({this.id = 0, this.createdAt, this.updatedAt}); BaseData copyWith({ int? id, String? createdAt, String? updatedAt, }) => BaseData( id: id ?? this.id, createdAt: createdAt ?? this.createdAt, updatedAt: updatedAt ?? this.updatedAt); }
子类QcData(修正后)
class QcData extends BaseData { String name; // 调用super初始化基类成员,同时添加子类的name参数 QcData({ super.id = 0, super.createdAt, super.updatedAt, this.name = "", }); @override QcData copyWith({ // 必须包含基类copyWith的所有可选参数,保证签名兼容 int? id, String? createdAt, String? updatedAt, String? name, }) { return QcData( id: id ?? this.id, createdAt: createdAt ?? this.createdAt, updatedAt: updatedAt ?? this.updatedAt, name: name ?? this.name, ); } }
额外优化思路
如果基类的copyWith逻辑复杂,也可以先调用基类的copyWith获取实例,再覆盖子类属性:
@override QcData copyWith({ int? id, String? createdAt, String? updatedAt, String? name, }) { final baseCopy = super.copyWith( id: id, createdAt: createdAt, updatedAt: updatedAt, ); return QcData( id: baseCopy.id, createdAt: baseCopy.createdAt, updatedAt: baseCopy.updatedAt, name: name ?? this.name, ); }
这样修改后,既符合Dart的重写规则,不会再报错,同时copyWith方法可以同时修改基类和子类的所有属性,满足模型类的复制需求。
内容的提问来源于stack exchange,提问作者pmatatias
相关产品推荐
相关产品推荐

