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チェックを回避する方法はありますか?コードからinstanceofを回避するためにrefelctionを使用できますか?

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 の場合もあります)。

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 に答える