0

XSDを使用してファイルから生成された複数のクラスがありますXJC. これらのクラスは、ビルド プロセスの一部として自動的に生成されるため、変更できません。クラスは共通の構造を共有しています。これらのクラスを使用する必要があるクライアント コードがあります。ただし、このクライアント ロジックの一部は、すべてのクラスで同じです。したがって、サポートするクラスごとにクライアント コードを複製したくありません。このような場合に頭に浮かぶ一般的な解決策は、インターフェイス/継承を使用して、クライアント コードが特定のクラスではなくスーパー クラス/インターフェイスのみを処理するようにすることです。ただし、この場合、クラスを変更できないため、この解決策は不可能です。したがって、継承の代わりに構成を使用するのが正しい方向だと思います。ただし、合成を使用する場合、合成クラスはすべての特定のクラスを処理する必要があるため、おそらく多くのクラスになります。if (obj instanceof Type)すべてのケースを個別に処理します。

public class A {
    private int id;
    //Properties specific to type A
}

public class B {
    private int id;
    //Properties specific to type B
}

public class C {
    private int id;
    //Properties specific to type C
}

public class Client {
    public void myMethod(Object obj) {
        //obj may be an instance of A, B or C

        //I would like to access the id property (which is common to A, B and C)
        //using the most elegant way

        //Approach using instanceof
        if(obj instanceof A) {
            A objA = (A)obj;
            objA.getId();
        }
        if(obj instanceof B) {
            B objB = (B)obj;
            objB.getId();
        }
        if(obj instanceof C) {
            C objC = (C)obj;
            objC.getId();
        }
    }
}

インスタンスがラップされ、instanceof ロジックがクライアント コードではなくラッパー クラス内にあるアプローチを使用することを考えました。

public class Wrapper {
    private Object obj;

    public int getId() {
        if(obj instanceof A)
            return ((A)obj).getId();
        if(obj instanceof B)
            return ((B)obj).getId();
        if(obj instanceof C)
            return ((C)obj).getId();
    }
}

public class Client {
    public void myMethod(Wrapper wrapper) {
        //Only deals with wrappers, not with the objects themselves

        wrapper.getId();
    }
}

この場合、 の使用はinstanceof必要ですか? はいの場合、推奨されるアプローチは何ですか?


編集:

リフレクションを使用して、多重を回避することもできますinstanceof。与えられた例に従って、getId()メソッドがすべてのクラス ( ABおよびC) で定義されている場合、次のことが可能です。

public class Wrapper {
    private Object obj;

    public int getId() {
        return obj.getClass().getMethod("getId").invoke(obj);
    }
}

私は XSD を制御できないことを忘れていました。

4

1 に答える 1

0

impromptu-interfaceを使用できます。

C# 4.0 (.net & silverlight) フレームワークを使用すると、オブジェクト (静的または動的) を継承していなくても静的インターフェイスでラップできます。

于 2016-03-11T09:26:18.670 に答える