我正在编写一个用于克隆对象的复制构造函数。当一个类引用一个对象时,会被其他几个类进一步介绍。
class Person
{
String name;
Address address;
}
class HomeAdress extends Address
{
}
class OfficeAdress extends Address
{
}
现在在Person的复制构造函数中,要决定要对哪个Address对象进行信息化,我必须使用instanceof。
public Person(Person p)
{
name = p.name;
if(p.address instanceof HomeAddress)
{
address = new HomeAddress((HomeAddress) address);
}else if(p.address instanceof OfficeAddress)
{
address = new OfficeAddress((OfficeAddress) address);
}
}
因此,当将新类型的地址添加到模型时,这是基本问题。我将不得不在Person复制构造函数中添加相同的检查。有没有办法避免instanceof检查实例化正确的地址对象。我可以使用refelction来避免代码中的instanceof吗?
答案 0 :(得分:8)
您应该将复制地址的责任委托给Address
课程。无论您是否实施Cloneable
,请在clone()
中添加Address
方法,然后您可以(如果需要自定义处理)在每个特定的Address
子类中覆盖它。然后在Person
复制构造函数中,您只需要:
this.address = p.address.clone();
答案 1 :(得分:-2)
首先,我猜这是一个错字:
address = new HomeAddress((HomeAddress) p.address);
其次,不是强制转换对象,而是可以在Address类中定义一个copy()方法,(可能是)abstract:
abstract class Address {
abstract Address copy ();
}
然后在Address的每个子类中实现该方法,然后可以在Person的构造函数中调用它:
public Person(Person p)
{
name = new String(p.name);
address = p.address.copy();
}