【问题标题】:using a method that is only defined in the subclasses - JAVA使用仅在子类中定义的方法 - JAVA
【发布时间】:2020-11-17 11:59:22
【问题描述】:

我正在尝试为我只能访问接口的 java 项目实现一个插件。
项目结构如下:

超类:A
子类:B、C、E 和 F

所有子类 B、C、D、E 和 F 都扩展了类 A,并有一个名为“execute()”的方法。该方法在超类(A)中没有定义。

现在我想在我的插件中实现一个名为“doSomething()”的方法,它使用子类 B、C、D、E 和 F 的“execute()”方法。
而且我不想重复相同的方法 4 次(对于每个子类)。

当我将超类(A)作为参数时,我无法访问子类中定义的方法:

public void doSomething(A a) {
   a.execute()
}

我还尝试生成 doSomething() 方法并定义多个上限,如下所示:

public <T extends B, C, D, E, F> void doSomething(T t) {
   t.execute();
}

但不能在上限中定义多个类,因为不可能有继承自多个超类的类型。

有没有什么方法可以实现 doSomething() 方法而不复制它或更改子类的源代码?
请注意,我不能更改任何给定的类(A,... F)。

【问题讨论】:

  • 如何让子类实现一个名为Executable 的接口,该接口定义execute()。然后你可以在doSomething中做public &lt;T extends A &amp; Executable&gt;

标签: java generics inheritance subclass superclass


【解决方案1】:

非常简单,在该类中将父级声明为abstract 并将execute() 声明为abstract。然后在父级中声明doSomething,但使其不是抽象的。然后从doSomething()调用execute()

abstract class Parent {
 abstract void execute();
void doSomething() {
 execute();
}
}

class B extends Parent {
 void execute() {
  //do some specific things for B
 }
}

【讨论】:

  • 问题是我不能改变任何给定的类(A,..,F)
  • @Siraj'eddineBenzineb 你没有在问题陈述中指定重要的事情
  • 但是你可以修改哪个类?
  • 我刚刚将其添加到说明中。我正在插件的一个随机类中实现 doSomething() 方法。
【解决方案2】:

大概是这样的:

public static void doSomething(Object object) {
        try {
            Method method = object.getClass().getDeclaredMethod("execute", null);
            method.invoke(object);
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }

A b = new B();
doSomething(b);

【讨论】:

  • 这似乎有效!由于这个问题没有更好的解决方案,我会批准这个。
猜你喜欢
  • 2011-01-26
  • 2017-02-21
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多