2

動作しているように見えますが、「良い」プログラミングと見なされますか?

明確にするための例を次に示します。

public class foo{
   foomethod(){do something};
}

public class foo1 extends foo{
    @override foomethod(){do something};
}

public class foo2 extends foo{
    @override foomethod(){do something};
}

ArrayList x /*with foo1 and foo2 objects*/
for (Object o : x){((foo)o).foomethod();}

これは「良い」プログラミングと考えられていますか? そうでない場合、コンパクトな代替案は何ですか? (可能であれば、switch(o.getClass()) を除く)

私はそれを明確にするのが本当に苦手なので編集してください:)

スーパーメソッドではなく、オーバーライドされたメソッドを呼び出すつもりです。私がやりたいことの代替方法は次のとおりです。

ArrayList x /* foo1 および foo2 オブジェクトで再び*/

for (Object o : x){
    switch(o.getClass()){
        case foo1.class:
            ((foo1)o).foomethod();
            break;
        case foo2.class:
            ((foo1)o).foomethod();
            break;
    }
}

しかし、switch ステートメントは避けたいと思います。なぜなら、コードがより大きく複雑になるからです。

4

3 に答える 3

2

それが受け入れられると考えられるかどうかは、まったく問題ではありません。本当の問題は、あなたが思っていることをしないということです。「オーバーライドされたメソッドを呼び出す」わけではありません。派生クラスのメソッドは引き続き呼び出されます。オーバーライドされたメソッドを呼び出す場合は、派生クラス内から super キーワードを使用する必要があります。

于 2012-12-16T00:24:28.590 に答える
2

おそらくジェネリックを使用したいでしょう:

public class Foo{
   public void fooMethod(){ System.out.println("Foo");};
}

public class Foo1 extends Foo{
    @Override public void fooMethod(){System.out.println("1");};
}

public class Foo2 extends Foo{
    @Override public void fooMethod(){System.out.println("2");};
}

...

List<Foo> x = new ArrayList<Foo>();
x.add(new Foo1());
x.add(new Foo2());
x.add(new Foo());

for (Foo o : x){ o.fooMethod();}

出力は次のようになります。

1
2
Foo
于 2012-12-16T00:28:46.050 に答える
1

動作しているように見えますが、「良い」プログラミングと見なされますか?

あなたの質問の文言の問題をモジュロ...

はい、スーパークラスでメソッドを宣言し、サブクラスでそれをオーバーライドし、多態的に呼び出すことは良いプログラミングです。

instanceofこれは、一連のテストやswitchクラス名にを使用するよりもはるかに優れています。これらのアプローチは「悪い」と見なされます...クラス階層の知識を他のコードに配線する必要があるためです。たとえば、 の別のサブクラスを追加する場合、Fooそれらのスイッチをすべてチェックし、場合によっては変更する必要があります。(そして、コンパイラはそれを行うようにあなたに思い出させません...)

于 2012-12-16T00:42:04.983 に答える