接口Loop中使用的实现

时间:2017-01-13 19:10:07

标签: java for-loop inheritance interface implementation

我在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();
}

2 个答案:

答案 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代码永远不会被某人试图做您从未想过的事情的安全意识 - 这意味着如果您有一个分布式库来保存内存中的秘密,请不要认为这些秘密是安全的

最佳!