2013-01-21 80 views
1

我可以创建父类是动态的子类吗?例如; class A extends B代码,我可以根据条件更改B吗?如果我可以从方法中返回它,那么方法的返回类型是什么?我的意思是class A extends getClassAccToCondition()返回类型。Java继承;从可变类型延伸

+1

你看过java中的泛型? – Gleeb

+0

您不能在运行时动态定义超类,它们必须明确定义。你做这件事的原因是什么?也许还有另一种选择。 –

+0

这是关于这个问题; http://stackoverflow.com/questions/14399843/abstractregionpainter-java-7-dynamic-import – rdonuk

回答

0

我决定使用一种像工厂模式一样的简单多态性变体。它会为我工作,我认为。感谢您的回答。

public class Main { 
    public static I getClassBelongToCondition(boolean Condition) { 
     if (Condition) { 
      return new A(); 
     } else { 
      return new C(); 
     } 
    } 

} 

interface I { 
} 

class A extends B implements I { 
} 

class C extends D implements I { 
} 

class B { 
} 

class D { 
} 
0

不,您正在扩展的类必须明确说明。

2

由于其他答案已经说这是不可能的。

对于这种问题,您可以使用工厂模式。如果你有一个 类层次结构是这样的:

class SuperType { ... } 
class SubType1 extends SuperType {...} 
class SubType2 extends SuperType {...} 

你可以有一个工厂这样的:

class Factory { 
    public static SuperType create (Condition cond) { 
    if(cond.matchForType1()) 
     return new SubType1(); 
    else 
     return new SubType2(); 
    } 
} 

可以比通过Factory.create(<condition that match for the required type>)调用此方法。

如果您搜索“工厂模式”+“java”,您会发现很多 更好的示例。

+0

但在我的情况下,'超级类型'是可变的。创建方法的返回类型是什么? – rdonuk

+0

SubType1和SubType2是SuperType的不同实现。返回的类型是'SuperType',所以根据你的条件你将得到相应的实现。 – Michael

0

从技术上说,它不可能在java中实现这一点。但是,我想尝试使用多态性和某种工厂方法模式来解决实际业务问题。不确定,如果这对你有帮助,但在java中不能实现不同的父项。

0

您不能在编译时定义一个不是静态类型的类。 但是,您可以在运行时生成类,请看javassist。这就是说,代码生成不是唯一的选择。如果您不需要动态超类,但只需要接口,则可以使用dynamic proxies