6

基本クラスから拡張されたオブジェクトのリストがあります。ここで、リスト内のクラスの1つのインスタンスにのみ特定の操作を適用したいと思います。

instanceofそこに良い習慣の使用はありますか?それとも、カスタムなどでオブジェクトを区別する必要がありますenumか?

abstract class Base;
class Foo extends Base;
class Bar extends Base;

List<Base> bases;

for (Base base : bases) {
  if (base instanceof Bar.class) {
     //execute my custom operation on the base object
     doSomething((Bar) base);
  }
}

そのアプローチが一般的にそれほど良くない場合、どうすればもっとうまくいくことができますか?

4

3 に答える 3

3

ここのインスタンスを使用する理由は実際にはないようです。基本クラスの動作をデフォルトで何もしないようにし、必要に応じてクラスを拡張する際にそれをオーバーライドすることは理にかなっています。このように、必要な場合にのみオーバーライドします(この例では必要ないという質問に従うために、これを抽象クラスとして残しました)。例えば:

abstract class Base{
    public void doSomething(){}
}

public class B0 extends Base{
    @Override
    public void doSomething(){//actually do something}
} 

public class B1 extends Base{}

これを使用する例は次のようになります。

public class SomeOtherClass{
    public void something(List<Base> bases){
         for(Base base:bases)
             base.doSomething();
    }
}
于 2013-02-12T22:06:30.613 に答える
2
abstract class Base;//abstract function doSomething()
class Foo extends Base;//implements doSomething()
class Bar extends Base;//dito

List<Base> bases;

for (Base base : bases) {
     base.doSomething();
}

あなたの質問に答えるには:instanceofを使用するのは良い考えではありません。

于 2013-02-12T21:50:00.987 に答える
1

ここでは、のインスタンスは適切な方法ではありません。

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();
}
于 2013-02-12T22:10:21.320 に答える