有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java抽象类,具有抽象字段和子类,无需强制转换

我创建了一个抽象基类。它包含一个对象,该对象应通过任何子类进行扩展:

public abstract class AbstractParent {
    protected AbstractObject subMePlz;
    // ... some fields that all subclasses need
    public AbstractParent() {
        this.subMePlz = createThisInYourExtendedClass();

    }

    public abstract AbstractObject createThisInYourExtendedClass();
} 

抽象对象:

public abstract class AbstractObject {
   // ... some fields/methods that all subclasses need 
}

我想要的是能够在扩展类中使用扩展字段,而无需强制转换:

public class ExtendParent extends AbstractParent {
     // .. some unique fields
     public ExtendParent(){
       super();
     }


   public ConcreteObject createThisInYourExtendedClass(){
        return new ConcreteObject();
   }

   // what I want to do - no cast
   public void doSomethingWithSubMePlzWithoutCastingIt() {
        System.out.println(this.subMePlz);  
   }

   // what I end up doing - gotta cast
   public void doSomethingWithSubMePlzWithoutCastingIt() {
        System.out.println((ConcreteObject)this.subMePlz);  
   }
}

需要一个比较器会改变我应该如何实现这一点吗?-我在考虑一个通用的比较器,用于它的子类可以使用的抽象对象列表


共 (1) 个答案

  1. # 1 楼答案

    你有两个选择:

    1. 放弃项目以在超类中声明字段。相反,在超类中添加一个内部抽象的“getter”方法——基本上,AbstractParent应该有一个方法abstract AbstractObject getSubMePlz()
    2. 使用泛型设置子类中subMePlz的类型:定义AbstractParent<T>为其subMePlz字段设置T

    就我个人而言,我经常发现选项1具有非常好的可扩展性——例如,您可以有另一个子类,它可以在不声明返回类型的情况下缩小getSubMePlz()返回类型的范围,这可能是有利的