2014-12-13 4 views
0

Я хотел бы назвать абстрактный метод в каждом подклассе. Вот пример:java abstract methode call all in subclasses

public abstract class ControllerAbs implements UiListener 

/** 
* implements from ui listener. when it's called, then must the ui be updated 
*/ 
@Override 
public synchronized void Update() { 
    // for change ui elements from another no fx-thread 
    // see http://stackoverflow.com/questions/21674152/timer-error-java-lang-illegalstateexception 
    Platform.runLater(new Runnable() { 
     @Override 
     public void run() { 
      UiUpdate(); 
     } 
    }); 
} 

/** 
* update ui in subcontroller 
*/ 
protected abstract void UiUpdate(); 

}

Теперь я протягиваю подкласс с абстрактным методом:

@Override 
protected void UiUpdate() { 
    // update ui 
} 

Но когда у меня есть более чем один подкласс, который будет простираться от controllerabs, только первый подкласс будет обновлен. Что не так?

Мне нужен метод, который будет вызываться в каждом подклассе.

С наилучшими пожеланиями, Сандро

ответ

0

Используйте ключевое слово super для того, чтобы вызвать метод для supclass определенной. Например. что-то вроде следующего:

public class SubClass1 extends ControllerAbs { 
    @Override 
    protected void UiUpdate() { 
     // Update for Subclass 1 
    } 

} 

public class SubClass2 extends SubClass1 { 
    @Override 
    protected void UiUpdate() { 
     // Update for Subclass 2 
     super.UiUpdate(); // update in the upper subclass 
    } 

} 

Используя это ключевое слово, вы можете обратиться к объекту, который выше в иерархии, и вызвать его реализацию метода.

+0

И когда я говорю, все подклассы должны быть расширены от контроллеров? ваше решение похоже на список. Я хотел бы дерево ... Это возможно? – user1851387

0

создать статический список контроллеров

пути создания нового контроллера или дка добавить его в список.

public class ControllerAbs() implements UiListener { 
    private static ArrayList<ControllerAbs> controllers; 

    // code 

    protected registerUiUpdateListener(ControllerAbs controller) { 
     controllers.add(controller); 
    } 

    /** 
    * implements from ui listener. when it's called, then must the ui be updated 
    */ 
    @Override 
    public synchronized void Update() { 
     // for change ui elements from another no fx-thread 
     // see http://stackoverflow.com/questions/21674152/timer-error-java-lang-illegalstateexception 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       for (ControllerAbs controller : controllers) { 
       controller.uiUpdate(); // update ui in controller 
      } 
     }); 
    } 

    /** 
    * update ui in subcontroller 
    */ 
    protected abstract void uiUpdate(); 
} 

    public class SubClass1 extends ControllerAbs { 
     public SubClass1() { 
      registerUiUpdateListener(this); // add to list 
     } 

     @Override 
     protected void uiUpdate() { 
      // lblTest.setText(testVariable); 
     } 
    } 

    public class SubClass2 extends ControllerAbs { 
     public SubClass2() { 
      registerUiUpdateListener(this); // add to list 
     } 

     @Override 
     protected void uiUpdate() { 
      // lblTest.setText(testVariable); 
     } 
    }