使用仅在子类中定义的方法 - JAVA
using a method that is only defined in the subclasses - JAVA
我正在尝试为我只能访问接口的 java 项目实现一个插件。
该项目具有以下结构:
超级class: 一个
subclasses: B, C, E and F
所有子classes B、C、D、E 和 F 都扩展了 class A 并且有一个名为“execute()”的方法。这个方法没有在superclass(A).
中定义
现在我想在我的插件中实现一个名为“doSomething()”的方法,它使用子classes B、C、D、E 和 F 的“execute()”方法。
而且我不想将相同的方法重复 4 次(对于每个子class)。
当我将 superclass (A) 作为参数时,我无法访问 subclasses:
中定义的方法
public void doSomething(A a) {
a.execute()
}
我还尝试生成 doSomething() 方法并定义多个上限,如下所示:
public <T extends B, C, D, E, F> void doSomething(T t) {
t.execute();
}
但是不可能在上限中定义多个 class,因为不可能有类型继承自多个 super-class.
有没有什么方法可以实现 doSomething() 方法而不复制它或更改子classes 的源代码?
请注意,我无法更改任何给定的 classes (A, ... F)。
很简单,声明parent为abstract
,声明execute()
为abstract
,同样在class中。然后在 parent 中也声明 doSomething
但使其不抽象。然后从 doSomething()
调用 execute()
abstract class Parent {
abstract void execute();
void doSomething() {
execute();
}
}
class B extends Parent {
void execute() {
//do some specific things for B
}
}
可能是这样的:
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);
我正在尝试为我只能访问接口的 java 项目实现一个插件。
该项目具有以下结构:
超级class: 一个
subclasses: B, C, E and F
所有子classes B、C、D、E 和 F 都扩展了 class A 并且有一个名为“execute()”的方法。这个方法没有在superclass(A).
中定义现在我想在我的插件中实现一个名为“doSomething()”的方法,它使用子classes B、C、D、E 和 F 的“execute()”方法。
而且我不想将相同的方法重复 4 次(对于每个子class)。
当我将 superclass (A) 作为参数时,我无法访问 subclasses:
中定义的方法public void doSomething(A a) {
a.execute()
}
我还尝试生成 doSomething() 方法并定义多个上限,如下所示:
public <T extends B, C, D, E, F> void doSomething(T t) {
t.execute();
}
但是不可能在上限中定义多个 class,因为不可能有类型继承自多个 super-class.
有没有什么方法可以实现 doSomething() 方法而不复制它或更改子classes 的源代码?
请注意,我无法更改任何给定的 classes (A, ... F)。
很简单,声明parent为abstract
,声明execute()
为abstract
,同样在class中。然后在 parent 中也声明 doSomething
但使其不抽象。然后从 doSomething()
execute()
abstract class Parent {
abstract void execute();
void doSomething() {
execute();
}
}
class B extends Parent {
void execute() {
//do some specific things for B
}
}
可能是这样的:
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);