2017-01-13 14 views
2

У меня есть некоторые проблемы с вызовами Action1 и Action2 классов Class1 и Class2 из for-loop. Я не могу сделать for (PreClass p : preClassArray), потому что эти методы не реализованы в PreClass. Если бы у меня был только один интерфейс, я мог бы написать I1[] preClassArray = new I1[3]; и сделать for (I1 p : preClassArray) и вызвать Action1, без проблем. Но мне также нужен Action2.Интерфейсы Реализации, используемые в Loop

Я думал об абстрактных методах Action1 и Action2 в PreClass, но мне нужны эти два метода только в 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(); 
} 

ответ

1

Использование наследования интерфейса:

public Interface I2 extends I1 { ... } 

I2[] preClassArray = new I2[3]; 


for (I2 p : preClassArray) { 
    p.Action1(); 
    p.Action2(); 
} 
+0

@alexbt почему я наследую его –

+0

Я думаю, это то, что мне нужно. Огромное спасибо. Я был неправ, думая, что реализация интерфейса другим требует переписывания этого :) – Nederes

0

Если вы не знаете, какие конкретные случаи вы работаете с являются (мое предположение здесь), то вам нужно будет проверить и бросить, чтобы иметь возможность доступ к его методам.

Другими словами, с учетом объекта, который вы можете проверить, чтобы увидеть, реализует ли этот объект данный интерфейс или класс. Чтобы ответить на ваш вопрос, я мог бы проверить, но я чувствую, что вы всегда должны пойти на самую конкретную проверку, которую вы могли бы сделать, в этом случае интересующие вас интерфейсы.

Также обратите внимание, что соглашение диктует, что имена методов должны быть верблюд, как в примере кода.

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-код НИКОГДА не защищен от того, кто пытается сделать то, что вы никогда не планировали, - это означает, что если у вас есть распределенная библиотека, в которой хранятся секреты в памяти, не считайте эти секреты безопасными.

Лучшее!

+0

Спасибо! Надеюсь, я пойму, как отразится время, когда придет время :) Instanceof интересен, не знал этого. Я попробую. Кстати, благодарю вас за то, что вы указали на случай верблюда и конвенцию. Я читаю это правильно. – Nederes