实例在这里不是一个好习惯。
正确的解决方案将取决于该doSomething
方法内部到底发生了什么。如果你按照自己的方式去做,那么除了其他事情之外,你还违反了里氏替换原则。我假设您首先因为某些原因决定需要这些层次结构,并且我还假设子类型具有比仅 doSomething 方法更多的行为。在这种情况下,您可以执行的操作如下所示。基本上只有doSomething
真正应该做的类型和其他类型做类似no operation
. 这样您就可以使用这些对象,而无需知道它们到底是什么类型。
您还应该问自己是否真的需要基类作为抽象类。也许您只需要一个界面。可能有更好的方法,但根据我所拥有的信息和我所假设的,这似乎没问题。
public abstract class Base
{
public abstract void doSomething();
public void someOtherMethod()
{
// which does stuff
}
}
public class SubTypeWhichCanDoSomething extends Base
{
@Override
public void doSomething()
{
// actually implement method and DO something
}
}
public class DoesNothing extends Base
{
@Override
public void doSomething()
{
// does nothing
return;
}
}
// then your code looks like these
for(Base base : bases)
{
base.doSomething();
}