有 Java 编程相关的问题?

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

java从超类方法返回子类对象

我不断回到这个问题的变体:它可能有一个非常简单的解决方案,但我似乎无法解决它

我有一系列形式为xQuantity的类,例如DistanceQuantity、AreaQuantity等,它们扩展了类DimensionQuantity。现在,您可以添加或减去DistanceQuantity或AreaQuantity等,但不能混合它们,因此我认为我需要在子类中使用(简短的)add、subtract等方法,但我希望将任何逻辑重复减少到最小。然而,我需要返回子类的一个对象,而这似乎很难从超类方法中实现。我相信这可以通过使用反射来实现,但是最后你仍然需要在子类方法中进行转换,我被告知反射可能会很昂贵。。。到目前为止,我想到的最好的方法是:

在距离数量上(以及其他类似的数量):

public DistanceQuantity() {     
}

public DistanceQuantity add(DistanceQuantity d1) {
    DistanceQuantity dn = new DistanceQuantity(); 
    Object o = super.add(dn, this, d1, DistanceUnit.REF_UNIT);
    return (DistanceQuantity) o;
}

在数量方面(减去一些不太相关的陈述):

public Object add(DimensionQuantity dn, DimensionQuantity d1, DimensionQuantity d2, 
  AbstractUnit au) {
    dn.unit = au;
    dn.scalar = d1.scalar + d2.scalar;
    dn.units = dn.scalar;    
    return dn;   
}

有人能想出更精简的代码吗?这仍然是类型安全的?短暂性脑缺血发作


共 (3) 个答案

  1. # 1 楼答案

    在Java6中,您可以尝试类似的方法。但使用泛型也是一个好主意:

    public abstract class DimensionQuantity {
    
        protected int quantity;
    
        public DimensionQuantity (int quantity) {
            this.quantity = quantity;
        }
    
        public abstract DimensionQuantity add(DimensionQuantity dq);
    }
    
    public class DistanceQuantity extends DimensionQuantity {
    
        public DistanceQuantity(Quantity quantity) {
            super(quantity);
        }
    
        /* 
         * A sub-class as return type is authorized.
         * If dq is not a DistanceQuantity, a ClassCastException is thrown, but you can change this.
         */
        @Override 
        public DistanceQuantity add(DimensionQuantity dq) throws ClassCastException {
            return new DistanceQuantity(this.quantity + (DistanceQuantity) dq.quantity);
        }
    }
    
  2. # 2 楼答案

    您可以像这样使用泛型:

    public abstract class DimensionQuantity<T extends DimensionQuantity>{
        public abstract T add(T parameter);
    }
    

    您可以这样扩展它:

    public class DistanceQuantity extends DimensionQuantity<DistanceQuantity>{
        public DistanceQuantity add(DistanceQuantity parameter){
            //Whatever
            return null;
        }
    }
    

    对于最初的问题,使用一个子类的超类是一个非常糟糕的想法(也是一个糟糕的做法)


    资源:

    关于同一主题:

  3. # 3 楼答案

    为维度创建枚举:

    公共枚举维度{面积,距离,…}

    扔掉你的子类。相反,只创建DimensionQuantity对象,并强制每个对象在创建时设置一个(不可变)维度

    在尺寸数量中进行添加,首先检查要添加的两个数量的尺寸是否相同

    瞧!类更少,类型安全,无重复代码