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()中都定义了该方法A,则可能出现以下情况:BC

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 回答