【问题标题】:How to override methods with an interface in java如何在java中使用接口覆盖方法
【发布时间】:2014-08-22 16:57:09
【问题描述】:

我有一个接口 I,实现它的两个类 A 和 B,以及接口 I 的泛型类型列表,因此它可以包含 A 和 B 类型的两个对象。

class A implements I
class B implements I
List<I> myList

我想(在一个单独的类中)编写两个方法 process( A a ) 和 process( B b ),这样我就可以循环遍历列表并为每个元素调用 process( i ),java 会自动(取消装箱? ) 对象并调用正确的方法。

class D{
    processList(){
        for( I i : myList ){
            process( i ); // invoke either process(A) or process(B) based on instanceof
        }
    }
    public void process(A a){...}
    public void process(B b){...}
}

我知道我可以通过在列表中的每个元素上调用“instanceof”然后 if-else 来调用不同的方法来做到这一点,但必须有更好的方法。

在MVC场景中,A类和B类在Model中,而D类在Controller中,因此需要分离。

谁能帮忙?

【问题讨论】:

  • 你能显示更多的示例代码吗?我很难在你显示的几行之间阅读。
  • 编辑:处理方法在哪里?你在 D 班之外展示他们。
  • 对不起,处理方法在D类中。
  • 使用包装器方法,在该方法中使用 instanceof 处理 if-else
  • 这是一个糟糕的解决方案,但我看到的唯一一个可用的解决方案。 OP会更好地接受下面艾略特的答案。

标签: java generics inheritance overloading


【解决方案1】:

一定有更好的办法。

有。将方法 process() 添加到接口I。然后,您可以在迭代 List&lt;I&gt; 时对项目调用 process -

List<I> list = new ArrayList<>(); 
// populate list with A and B instances, then
for (I i : list) {
  i.process();
}

显然AB 必须提供process() 的具体实现。

【讨论】:

  • 谢谢,但这对我不起作用,处理方法需要在一个单独的类中处理用户界面。
  • 如果这不是一个选项,那么下一个最佳选择可能是使用Visitor Pattern
  • @max 我认为对接口进行编程是正确的解决方案。您可以在单独的类中调用接口方法,您必须有一个实例以某种方式对 A 或 B 执行某些操作。
  • 看起来您可以使用访问者模式和双重分派来做到这一点,但访问者模式要求您将流程方法添加到基类(此处为接口)。 OP 说他不能。
  • 我同意@markspace。如果您因为感知到的 MVC 要求而限制自己,那么您将是“精打细算”。
猜你喜欢
  • 2014-07-17
  • 2016-08-12
  • 1970-01-01
  • 2021-08-12
  • 2011-08-04
  • 2014-05-23
  • 1970-01-01
  • 2017-02-16
  • 2015-10-31
相关资源
最近更新 更多