循环中使用的接口实现

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 代码永远不会安全,因为有人试图做您从未打算做的事情 - 这意味着如果您有一个在内存中保存秘密的分布式库,请不要假设这些秘密很安全。

最好!