【发布时间】:2011-07-21 23:03:20
【问题描述】:
假设您有一个派生类,其中基类是您无法修改的。基类有很多状态(很多非常量的私有成员)和很多构造函数,使用不同数量的参数来初始化状态的某个子集(当然,子集的大小因构造函数而异)。
现在我的派生类是基类的一个非常轻量级的包装器。假设它没有添加自己的状态,只是稍微修改了几个方法的行为(可能围绕super.originalMethod() 调用做一些额外的日志记录)。
我遇到的问题是我想获取基类的一个对象,并创建它的“副本”,具有相同的状态,但作为派生类的一个实例。
事实证明这很困难。我不能调用基类的“最完整”构造函数,通过调用 getter 从源传递所有状态,因为根据基类的构造方式,某些状态值可能会被此构造函数拒绝。例如,您可以使用 0-arg ctor 创建一个默认对象,任何许多值都将为空。但是,在允许您指定这些值的 ctor 中传递空值是不合法的。
此外,上面的方法很脆弱,因为如果对基类进行修改,会添加更多状态,以及“更完整”的构造函数(或不能在构造函数中设置的状态,只能通过访问器方法设置)已添加,副本将不再完整。
我想要的是像`clone(),而是初始化一个相同类型的新对象,初始化派生类的基类成员。我想这样的事情是不存在的。有关可能提供等效功能的模式的任何建议?
请记住,我不能修改基类。如果可以的话,这会容易得多。
【问题讨论】:
标签: java design-patterns constructor clone factory