循环中使用的接口实现
Interfaces Implementations used in Loop
我在从 for 循环调用 类 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 中需要这两个方法,所有其他扩展PreClass 的98 类 不需要它。所以我不想为他们实现98个抽象的Actions。
请帮我解决这个问题。我可能完全错了,刚开始 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();
}
使用接口继承:
public Interface I2 extends I1 { ... }
I2[] preClassArray = new I2[3];
for (I2 p : preClassArray) {
p.Action1();
p.Action2();
}
如果您不知道您正在使用的特定实例是什么(我在这里的假设),那么您将需要检查并强制转换才能访问它的方法。
换句话说,给定一个对象,您可以检查该对象是否实现了给定的接口或 class。为了回答你的问题,我可以检查其中任何一个,但我觉得你应该总是尽可能地进行最具体的检查,在这种情况下是你感兴趣的接口。
另请注意,惯例规定方法名称应采用驼峰式大小写,如提供的示例代码中所示。
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 代码永远不会安全,因为有人试图做您从未打算做的事情 - 这意味着如果您有一个在内存中保存秘密的分布式库,请不要假设这些秘密很安全。
最好!
我在从 for 循环调用 类 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 中需要这两个方法,所有其他扩展PreClass 的98 类 不需要它。所以我不想为他们实现98个抽象的Actions。
请帮我解决这个问题。我可能完全错了,刚开始 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();
}
使用接口继承:
public Interface I2 extends I1 { ... }
I2[] preClassArray = new I2[3];
for (I2 p : preClassArray) {
p.Action1();
p.Action2();
}
如果您不知道您正在使用的特定实例是什么(我在这里的假设),那么您将需要检查并强制转换才能访问它的方法。
换句话说,给定一个对象,您可以检查该对象是否实现了给定的接口或 class。为了回答你的问题,我可以检查其中任何一个,但我觉得你应该总是尽可能地进行最具体的检查,在这种情况下是你感兴趣的接口。
另请注意,惯例规定方法名称应采用驼峰式大小写,如提供的示例代码中所示。
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 代码永远不会安全,因为有人试图做您从未打算做的事情 - 这意味着如果您有一个在内存中保存秘密的分布式库,请不要假设这些秘密很安全。
最好!