ここでは、のインスタンスは適切な方法ではありません。
doSomething正しい解決策は、そのメソッド内で正確に何が起こっているかによって異なります。それを自分のやり方で行うと、他のことに加えて、リスコフの置換原則に違反します。そもそも何かのためにこれらの階層が必要であるとあなたが判断したと思います。また、サブタイプにはdoSomethingメソッドだけよりもいくつかの動作があると思います。この場合、できることを以下に示します。基本的doSomethingに、実際にそれを実行する必要があるタイプのみで、残りのタイプはのようなことを実行しますno operation。このようにして、これらのオブジェクトが実際にどのタイプであるかを知らなくても、これらのオブジェクトを使用できます。
また、Baseクラスを抽象クラスにする必要があるかどうかも自問する必要があります。たぶんあなたが必要とするのはインターフェースだけです。より良いアプローチがあるかもしれませんが、私が持っている情報と私が仮定したことに基づいて、これは大丈夫のようです。
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();
}