簡體   English   中英

如何動態覆蓋對象中的方法

[英]How to dynamically override a method in an object

如果可行,在創建該類的實例並希望保留對該對象的引用但在其類的定義中覆蓋一個公共方法之后,如何更改方法的作用?

這是我的代碼:

    package time_applet;

    public class TimerGroup implements Runnable{

        private Timer hour, min, sec;
        private Thread hourThread, minThread, secThread;

        public TimerGroup(){
            hour = new HourTimer();
            min = new MinuteTimer();
            sec = new SecondTimer();
        }


        public void run(){
            hourThread.start();
            minThread.start();
            secThread.start();
        }

/*Please pay close attention to this method*/
        private Timer activateHourTimer(int start_time){
            hour = new HourTimer(start_time){

                public void run(){
                    while (true){

                        if(min.changed)//min.getTime() == 0)
                            changeTime();

                    }

                }
            };
            hourThread = new Thread(hour);
            return hour;
        }

        private Timer activateMinuteTimer(int start_time){

            min = new MinuteTimer(start_time){
                public void run(){
                    while (true){

                        if(sec.changed)//sec.getTime() == 0)
                            changeTime();

                    }

                }
            };
            minThread = new Thread(min);    
            return min;
        }

        private Timer activateSecondTimer(int start_time){
            sec = new SecondTimer(start_time);
            secThread = new Thread(sec);
            return sec;
        }

        public Timer addTimer(Timer timer){
            if (timer instanceof HourTimer){
                hour = timer;
                return activateHourTimer(timer.getTime());
            }
            else if (timer instanceof MinuteTimer){
                min = timer;
                return activateMinuteTimer(timer.getTime());
            }
            else{
                sec = timer;
                return activateSecondTimer(timer.getTime());        
            }
        }
    }

因此,例如在activateHourTimer()方法中,我想覆蓋小時對象的run()方法,而不必創建新對象。 我該怎么辦?

不,您不能在同一類中多次重寫相同的方法,並且您正在創建HourTimer的匿名類。

      hour = new HourTimer(start_time){

            public void run(){
                while (true){

                    if(min.changed)//min.getTime() == 0)
                        changeTime();

                }

            }
        };

您可以通過在ifactHourTimer方法中放入一個if else條件作為休假方式來實現此目的-

     private Timer activateHourTimer(int start_time){
       if(Condition1){
           hour = new HourTimer(start_time){

              public void run(){
                  while (true){

                      //First Condition
                  }

              }
          };
       }else if(Condition2){
           hour = new HourTimer(start_time){

              public void run(){
                  while (true){

                      //Second Condition
                  }

              }
          };
       }else{
           hour = new HourTimer(start_time){

              public void run(){
                  while (true){

                      //Third Condition
                  }

              }
          };
       }
        hourThread = new Thread(hour);
        return hour;
    }

您不能覆蓋本地(匿名)類的方法,但是可以通過匿名類覆蓋整個方法:

TimerGroup customTimerGroup = new TimerGroup() {
    private Timer activateHourTimer(int start_time) {
        hour = new HourTimer(start_time){ 
            public void run() {
                // do something different
            }
        };
        hourThread = new Thread(hour);
        return hour;
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM