我在for-loop中调用类Class1和Class2的方法Action1和Action2时遇到了一些问题。我无法for (PreClass p : preClassArray)
,因为此方法未在PreClass中实现。如果我只有一个接口,我可以写I1[] preClassArray = new I1[3];
并执行for (I1 p : preClassArray)
并调用Action1,没问题。但我也需要Action2。
我考虑过PreClass中的抽象方法Action1和Action2,但我只需要在Class1和Class2中使用这两个方法,所有其他98个扩展PreClass的类都不需要它。所以我不想为他们实现98个抽象的动作。
请帮助我,弄明白这一点。我可能完全错了,刚开始Java和编程。谢谢。
//...
PreClass[] preClassArray = new PreClass[3];
pc[0] = new Class1();
pc[1] = new Class2();
pc[2] = new Class1();
for ( /*Don't know how to point on I1 and I2 here*/ p : preClassArray) {
p.Action1();
p.Action2();
}
}
class PreClass {
//...
}
class Class1 extends PreClass implements I1, I2 {
// realization of Action1 and Action2
}
class Class2 extends PreClass implements I1, I2 {
// same here...
}
interface I1 {
void Action1();
}
interface I2 {
void Action2();
}
答案 0 :(得分:1)
使用接口继承:
public Interface I2 extends I1 { ... }
I2[] preClassArray = new I2[3];
for (I2 p : preClassArray) {
p.Action1();
p.Action2();
}
答案 1 :(得分:0)
如果您不知道您正在使用的具体实例是什么(我的假设在这里),那么您需要检查并投射以便能够访问其方法。
换句话说,给定一个对象,您可以检查该对象是否实现了给定的接口或类。要回答你的问题,我可以检查,但我觉得你应该总是去做你能做的最具体的检查,在这种情况下是你感兴趣的接口。
另请注意,约定规定方法名称应为camel case,如提供的示例代码所示。
public class Test {
public static void main(String[] args) {
PreClass[] preClassArray = new PreClass[3];
preClassArray[0] = new Class1();
preClassArray[1] = new Class2();
preClassArray[2] = new Class1();
for ( Object p : preClassArray) {
if ( p instanceof I1 ) ((I1)p).action1();
if ( p instanceof I2 ) ((I2)p).action2();
}
}
static class PreClass {
//...
}
static class Class1 extends PreClass implements I1, I2 {
public void action1() { System.out.println("Action1"); }
public void action2() { System.out.println("Action2"); }
}
static class Class2 extends PreClass implements I1, I2 {
public void action1() { System.out.println("Action1"); }
public void action2() { System.out.println("Action2"); }
}
static interface I1 {
void action1();
}
static interface I2 {
void action2();
}
}
这是高效和优雅的,但是,如果你想要有一些乐趣,你也可以使用反射!这里有一些反思乐趣(请不要在生产应用程序中这样做!)
public static void main(String[] args) {
PreClass[] preClassArray = new PreClass[3];
preClassArray[0] = new Class1();
preClassArray[1] = new Class2();
preClassArray[2] = new Class1();
for ( Object p : preClassArray) {
for ( Method m : p.getClass().getDeclaredMethods() ) {
if ( m.getName().equals("action1") || m.getName().equals("action2") ) {
try {
m.invoke( p );
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
当然不如第一个例子那么优雅,但有点酷,你可以轻松地破解Java。我提供了第二个示例,以提高您的Java代码永远不会被某人试图做您从未想过的事情的安全意识 - 这意味着如果您有一个分布式库来保存内存中的秘密,请不要认为这些秘密是安全的
最佳!