我如何区分超类数组中的不同子类?

How do i differentiate different subclasses in a array of the superclass?

我的设置如下。 我有一个名为 "bottles" 的超类和 2 个不同的子类,"water" 和 "soda"。有一个数组充满了无数的这两个,我的目标是编写一个方法 returns 这些子类中只有一个的总升值。实现这一目标的最佳方法是什么?据我了解 'instanceof' 在这里没有用。

澄清一下,我只想知道operator/method用来比较什么:

if (bottles[0]==soda){
      ...
}

IIRC,instanceof 仍然有效。

但是,如何将计数升标准的逻辑放在子类方法中?因此,如果你想计算瓶中甜饮料的升数,你的水应该 return 0 但你的苏打水应该 return 真正的升。既然子类自己最清楚,最好让他们直接给你答案。不要破坏封装。

if(bottles[i] instanceof Soda) {
    return bottles[i].getRealLiter();
    }
 else if(bottles[i] instanceof Water) {
    return 0;
}

一般来说,如果您控制了 Bottle 类,但您仍然需要在代码中使用 instanceof,那么您的设计就有问题。

interface Bottle{
  void addLiters(LiterCalculator calculator);
}

LiterCalculator 看起来像这样,

interface LiterCalculator{
   public addWater(int liters);
   public addSoda(int liters);
   //so on
}

而SodaBottle负责自己添加;

class SodaBottle implements Bottle {
private int liters;

public void addLiters(LiterCalculator calculator) { calculator.addSoda(liters); }
}

因此您的流程不再负责 Bottle 实例的不同计算。