Oop 如何在不可变抽象基类的默认方法中实例化子类?

Oop 如何在不可变抽象基类的默认方法中实例化子类?,oop,dart,design-patterns,Oop,Dart,Design Patterns,如何在不可变抽象基类的默认方法中实例化子类,例如,返回具有修改属性的新实例 我有一个抽象文档类,它有几个不可变的属性。 调用createDocument或updateDocument方法时,应返回一个新实例,并将字段设置为新值。我不想重写每个子类中的方法,因为逻辑将保持相同=>重复代码。是否有一种方法/模式可以绕过这个问题,或者我只是缺少了一些东西 abstract class Document extends Model { final Version version; fin

如何在不可变抽象基类的默认方法中实例化子类,例如,返回具有修改属性的新实例

我有一个抽象文档类,它有几个不可变的属性。 调用createDocument或updateDocument方法时,应返回一个新实例,并将字段设置为新值。我不想重写每个子类中的方法,因为逻辑将保持相同=>重复代码。是否有一种方法/模式可以绕过这个问题,或者我只是缺少了一些东西

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,是的,我知道我无法创建文档的实例。应该实例化扩展文档的子类。我想我在这里的表述是错误的。