Inheritance 避免多态性可以';不可用

Inheritance 避免多态性可以';不可用,inheritance,design-patterns,polymorphism,object-composition,Inheritance,Design Patterns,Polymorphism,Object Composition,我使用XJC从XSD文件生成了多个类。这些类是作为构建过程的一部分自动生成的,因此不能修改。这些类共享一个公共结构。我有需要使用这些类的客户端代码。但是,对于所有类,这些客户机逻辑中的一些是相同的。因此,我不想为要支持的每个类复制客户机代码。在这种情况下想到的流行解决方案是使用接口/继承,这样客户机代码只处理超类/接口,而不是特定的类。但是,在这种情况下,这种解决方案是不可能的,因为类不能被修改。因此,我想正确的方向是使用组合而不是继承。但是,如果使用组合,组合类将需要处理每个特定的类,因此我可

我使用
XJC
XSD
文件生成了多个类。这些类是作为构建过程的一部分自动生成的,因此不能修改。这些类共享一个公共结构。我有需要使用这些类的客户端代码。但是,对于所有类,这些客户机逻辑中的一些是相同的。因此,我不想为要支持的每个类复制客户机代码。在这种情况下想到的流行解决方案是使用接口/继承,这样客户机代码只处理超类/接口,而不是特定的类。但是,在这种情况下,这种解决方案是不可能的,因为类不能被修改。因此,我想正确的方向是使用组合而不是继承。但是,如果使用组合,组合类将需要处理每个特定的类,因此我可能会使用许多
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
?如果是,建议的方法是什么


编辑:

反射还可用于避免出现多个
实例。根据给定的示例,如果在每个类(
A
B
C
)中定义了
getId()
方法,则可能出现以下情况:

public class Wrapper {
    private Object obj;

    public int getId() {
        return obj.getClass().getMethod("getId").invoke(obj);
    }
}
我忘了提到我对XSD没有任何控制权。

您可以使用

C#4.0(.net和silverlight)框架,允许您包装任何对象 (静态或动态)具有静态接口,即使它没有 从中继承


您可以使用xjb文件自定义类的生成,并使它们实现接口。例如,请参阅。@JBNizet根据我的经验,尝试调整JAXB/XJC可能是一场噩梦。此外,实现接口需要在生成的类中重写方法,但情况并非总是如此。相似的结构并不一定意味着相同的方法。可能有名称不同但返回信息在逻辑上相同的方法。每个类中都有getId()方法吗?如果是,您知道使用反射的解决方案。如果所有应该有getId()方法的类都没有getId()方法,那么这表明您的模式有问题,因为您希望它们有问题。编译器将警告您这个问题(对于调用getId()的基于反射的方法,情况并非如此)。由您选择实现哪个接口的类。XJB允许这样做。我并不是说所有的类都实现了这个接口。只有应该实现它的类,因为它们都应该有一个getId()方法返回int.@JBNizet Right,但在我的例子中,我对模式没有任何控制权。