我有以下情况:
class Parent {}
class Child1 extends Parent {}
class Child2 extends Parent {}
interface ExternalSystem {
Parent materialize(Parent a)
}
class Child1System implements ExternalSystem {
Parent materialize(Parent a) {
// specialize a and convert it into Child1
}
}
class Child2System implements ExternalSystem {
Parent materialize(Parent a) {
// specialize a and convert it into Child2
}
}
我想让用户创建Parent
类型的对象。使用Parent
提供的信息,系统的某些组件可以正常运行。但是,在某些时候,我想在外部系统中实现这些对象,并且根据我调用的ExternalSystem
实现,Parent
对象现在应该是专用对象。
有没有办法创建新的子对象并替换父对象使用的空间?
我不能仅使用Parent a
或Child1
类型的新对象替换Child1
对象,因为a
可能已在其他位置引用。所以,基本上,我想要的是所有引用继续查看Parent a
,而不是a
类型Parent
,它现在将是一个子类型。
或者,这可以设计不同吗?
答案 0 :(得分:4)
Java中没有placement new功能。根据托管堆的定义。
您唯一能做的就是创建实现ExternalSystem的代理对象。该代理将调用child1或child2的实例。
答案 1 :(得分:3)
有没有办法创建新的子对象并替换父对象使用的空间?
没有办法。对象的类型在对象的生命周期内不会更改。给定引用始终指向同一对象。
你可以做的是使用某种代理或委托机制,并让代理/委托在其生命周期中引用不同的东西。代理/委托对象的类型不会改变,但在大多数方面它的行为类似于其中一个子类型的实例。 (有一件事无效......当然......将是instanceof
运营商。)