Oop 如何在不可变抽象基类的默认方法中实例化子类?
如何在不可变抽象基类的默认方法中实例化子类,例如,返回具有修改属性的新实例 我有一个抽象文档类,它有几个不可变的属性。 调用createDocument或updateDocument方法时,应返回一个新实例,并将字段设置为新值。我不想重写每个子类中的方法,因为逻辑将保持相同=>重复代码。是否有一种方法/模式可以绕过这个问题,或者我只是缺少了一些东西Oop 如何在不可变抽象基类的默认方法中实例化子类?,oop,dart,design-patterns,Oop,Dart,Design Patterns,如何在不可变抽象基类的默认方法中实例化子类,例如,返回具有修改属性的新实例 我有一个抽象文档类,它有几个不可变的属性。 调用createDocument或updateDocument方法时,应返回一个新实例,并将字段设置为新值。我不想重写每个子类中的方法,因为逻辑将保持相同=>重复代码。是否有一种方法/模式可以绕过这个问题,或者我只是缺少了一些东西 abstract class Document extends Model { final Version version; fin
abstract class Document extends Model {
final Version version;
final Id id;
final DateTime createdAt;
final DateTime modifiedAt;
Document(this.version, {this.id, this.createdAt, this.modifiedAt})
Document createDocument(Id id, DateTime timestamp) {
// some validation logic here
// TODO
// Instantiate a class of the same type that extends document (e.g. user in this example) and set the id, createdAt fields
}
Document updateDocument(DateTime timestamp) {
// some validation logic here
// TODO
// Instantiate a class of the same type that extends document (e.g. user in this example) and set modified at field
}
}
class User extends Document {
static const Version VERSION = Version(1,0,0);
final int someProperty;
User(this.someProperty) : super(VERSION)
}
我的一个想法是实现一个抽象的copyWith方法
Document copyWith({Id id, DateTime modifiedAt, DateTime createdAt});
但这意味着其他类可以访问copy方法并设置任意值,这将破坏方法中验证逻辑的全部目的,并且会使代码膨胀。此外,因为我使用的是Dart,所以我不能真正使用受保护的方法
任何帮助都将不胜感激 我会制作一个虚拟私有拷贝功能:
抽象类文档扩展模型{
最终版本;
最终Id;
最终日期时间创建日期;
最终日期时间修改日期;
文档(this.version,{this.id,this.createdAt,this.modifiedAt})
文档副本({Id Id,DateTime createdAt,DateTime modifiedAt});
Document createDocument(Id,DateTime时间戳)=>
_副本(id:id,createdAt:timestamp);
文档更新文档(日期时间时间戳){
//这里有一些验证逻辑
返回副本(修改日期:时间戳);
}
}
类用户扩展文档{
静态常量版本=版本(1,0,0);
最终财产;
用户(this.someProperty):超级(版本)
用户.(版本,,
{Id Id,DateTime createdAt,DateTime modifiedAt,this.someProperty})
:super(版本,id:id,createdAt createdAt,modifiedAt:modifiedAt);
用户_copy({Id Id,DateTime createdAt,DateTime modifiedAt,int someProperty})=>
用户.(版本,,
id:id??这个,
createdAt:createdAt??this.createdAt,
modifiedAt:modifiedAt??this.modifiedAt,
someProperty:someProperty??this.someProperty);
}
这应该确保只有您可以调用创建对象而无需验证的private helper方法,并且您的createDocument
方法将与您的任何子类一起工作(只要它忠实地实现\u copy
)
这意味着您必须在同一个库中声明所有类。欢迎使用StackOverflow。您无法创建
文档
的实例,因为它是一个抽象类。我删除了java
标记,因为这似乎与java无关,而immutability
标记似乎与不可变的基类没有直接关系。嗨,marc,是的,我知道我无法创建文档的实例。应该实例化扩展文档的子类。我想我在这里的表述是错误的。