0

我正在编写一个用于克隆对象的复制构造函数。当一个类引用了一个对象,该对象被少数其他类进一步继承。

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吗?

4

2 回答 2

8

您应该将复制地址的责任委托给Address班级。无论您是否实现Cloneable,都将一个clone()方法放入 中Address,然后您可以(如果您需要自定义处理)在每个特定的Address子类中覆盖它。然后在您的Person复制构造函数中,您只需要:

this.address = p.address.clone();
于 2013-03-01T14:11:16.573 回答
-2

首先,我想这是一个错字:

address = new HomeAddress((HomeAddress) p.address);

其次,您可以在 Address 类中定义一个 copy() 方法,而不是强制转换对象,(可能是)抽象:

abstract class Address {
    abstract Address copy ();
}

并且你在Address的每个子类中实现该方法,然后你可以在Person的构造函数中调用它:

public Person(Person p)
{
    name = new String(p.name);
    address = p.address.copy();
}
于 2013-03-01T14:15:09.093 回答