使用变量类实例化抽象类

由于显而易见的原因,我们不能像这样直接实例化一个抽象类:


AbstractObj obj = new AbstractObj(); 

其中 AbstractObj 是以下形式的一个类:


public abstract class AbstractObj {

//... Body omitted 

}

但是,如果我们有扩展类,例如:


public class ConcreteObj extends AbstractObj {

//... Body omitted

}


public class AnotherObj extends AbstractObj {

//... Body omitted

}

是否可以通过以下方式实例化对象?这将根据传入的变量的类确定必须使用哪个构造函数。现在假设 o1 和 o2 保证为相同类型。


protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2){

    AbstractObj delta = ...?

}

例如,在上面,如果 o1 是 ConcreteObj 类型,有没有办法在运行时识别它是否属于这种类型并使用适当的构造函数?


当年话下
浏览 119回答 3
3回答

慕妹3146593

这里 :protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2){   AbstractObj delta = ...?}您可以获得o1with的具体类o1.getClass()。然后,如果这个具体类有一个默认构造函数,你可以调用它Class.newInstance():protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2) throws IllegalAccessException, InstantiationException{   AbstractObj delta = o1.getClass().newInstance();}

开心每一天1111

您可以使用 instanceof 语句。您可以将 o1 转换为 ConcreteObj 并使用此类的方法或字段。if(o1 instanceof ConcreteObj){  //((ConcreteObj)o1).someMethod();}

慕神8447489

这绝对是代码气味。不要使用 instanceof。不要使用反射。绝对不要继续走这条路。您的所有AbstractObj实例都实现了一组通用操作。由于您computeDiff对 AbstractObjs 进行操作,因此它不能依赖于它接收的不同实现的任何特殊功能。因此,方法接收或返回什么类型的对象并不重要,只要它们都遵守 AbstractObj 定义。如果需要,您可以返回一个扩展 AbstractObj 的匿名类或任何其他子类。您甚至可以为此目的创建一个特定的子类。但是无论你返回什么,它都不能返回比 AbstractObj 更多的东西。将参数和返回值声明为AbstractObj与调用您方法的人签署的合同。不要破坏你的合同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java