繁体   English   中英

将类型强制转换为超类并调用重写的方法是否可以接受? (JAVA)

[英]Is type casting to super class and calling an overriden method acceptable? (Java)

看起来可行,但是它被认为是“好的”编程吗?

这是一个例子,以澄清:

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()))

编辑,因为我真的很难澄清它似乎:)

我的意思是调用已被覆盖的方法,而不是调用super方法。 我想做的另一种方法是:

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语句,因为它会使代码更大,更复杂。

是否被认为是完全可以接受的。 真正的问题是它没有按照您认为的那样做。 它不会“调用重写的方法”。 派生类的方法仍被调用。 如果要调用重写的方法,则必须在派生类中使用super关键字。

您可能要使用泛型:

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

看起来可行,但是它被认为是“好的”编程吗?

用您的问题的措辞来模量问题...

是的,在超类中声明一个方法,在子类中重写它,然后进行多态调用是一种很好的编程方法。

它肯定比使用测试instanceof链或类名称的switch好得多。 这些方法被认为是“不好的”……因为它们涉及将过多的类层次结构知识连接到其他代码中。 例如,如果添加Foo另一个子类,则所有这些开关都需要检查并可能更改。 (而且编译器不会提醒您这样做...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM