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测试链或 a好得多。switch这些方法被认为是“坏的”......因为它们涉及将太多的类层次结构知识连接到其他代码中。例如,如果您添加 的另一个子类,则Foo需要检查所有这些开关并可能进行更改。(而且编译器不会提醒你这样做......)

于 2012-12-16T00:42:04.983 回答