<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java內部類:如何在內部類中返回外部類對象

    Posted on 2006-03-02 20:49 killvin 閱讀(532) 評論(0)  編輯  收藏 所屬分類: java

    Nasted Class 的介紹,請詳見參考

    今天討論的不是不是內部類的概念,而是具體使用的一個場景-如何在內部類中返回外部對象

    看一段代碼

    import java.util.LinkedList;
    import java.util.List;


    public class OuterClass
    {

     private List listeners = new LinkedList();

     public void addListeners(IListener listener)
     {
      this.listeners.add(listener);
     }


     private OuterClass outer = this;  (1)
     private class InnterClass
     {
      public void publish()
      {
       //將事件發布出去 (2)
       for(int i=0;i < listeners.size();i++)
       {
        IListener listener = (IListener) listeners.get(i);
        listener.receiveEvent(outer);
       }

      }
     }


     public void execute()
     {
      InnterClass in = new InnterClass(); (3)
      in.publish();

     }
    }

    public interface IListener
    {

    public void receiveEvent(OuterClass obj);
    }

    你可能覺得這個例子很別扭,在哪里讓你覺得難受呢?其實問題的關鍵就在于接口IListener的定義,這里需要給receiveEvent方法傳遞的參數是外部對象!(別激動,下面我會說明需要傳遞的一個場景)

    場景

    在一個GUI系統中,我們要在畫板WorkSpace(WorkSpace實現了IListener接口)上產生一顆樹,但樹中的每個節點的產生(繪圖)是我們不知道的算法,系統只為我們提供了一些繪圖的接口,并返回元素的句柄!看來我們需要"包裝"一下這個繪圖的句柄Brush(其實我把它叫做筆刷,因為它只知道如何"刷"出圖像來,就這點本事!)并對外提供節點Node這樣一個通用的類。

    此時Node與Brush的關系就很微妙了,不過我們可以拋開這些外表,看到Node與Brush其實就是外部類與內部類的關系!-第一步完成了:確定了兩者的關系

    然而,事情沒有這么簡單,Node類必須處理一些事件,而這些事件理所當然只有Brush能夠看懂,而Node根本不知道這樣的事件處理過程,現在有兩個辦法:辦法一,讓Node實現Brush所有的事件;辦法二,把Brush返回回去,讓它來處理自己的事件,看來辦法二是個好主意,因為我可以不關心事件的種類!-第二步完成了:確定了事件處理的責任

    還沒完呢,你肯定不希望畫板WorkSpace面對的是繪圖的句柄Brush這樣的對象,相反你只希望WokSpace只知道Node的存在!IListener接口中receiveEvent方法的參數定義為OuterClass 就由此而來!-第三步完成:接口的定義

    public interface IListener
    {

    public void receiveEvent(OuterClass obj);
    }

     既然說清楚了這個問題(應該比較清楚了吧?)那改如何實現這樣一個蹩腳而有無可奈何的設計呢?讓我們回憶一下內部類,內部類擁有訪問外部類的方法與屬性的權限

     private OuterClass outer = this;  - 這個對外部類的引用就是為內部類的訪問準備的

     private class InnterClass
     {
      public void publish()
      {
       //將事件發布出去 

       for(int i=0;i < listeners.size();i++)
       {
        IListener listener = (IListener) listeners.get(i);
        listener.receiveEvent(outer);  - 這里不可以返回this,因為this代表的是內部類自己
       }
      }

     

     

    參考

    Java Nested class   http://blog.csdn.net/Killvin/archive/2006/01/10/574983.aspx

    初識Java內部類    http://blog.csdn.net/killvin/archive/2006/01/10/574991.aspx

    主站蜘蛛池模板: 日韩成人毛片高清视频免费看| 毛片免费在线视频| 亚洲av午夜电影在线观看 | 亚洲人成人网毛片在线播放| 亚洲国产精品久久久天堂| 亚洲国产精品一区二区九九| 免费看片免费播放| 拨牐拨牐x8免费| 九九精品免费视频| 18pao国产成视频永久免费| a级成人免费毛片完整版| 一个人免费观看www视频| 亚洲a无码综合a国产av中文| 亚洲人成综合网站7777香蕉| 亚洲国产综合自在线另类| 亚洲激情中文字幕| 亚洲人成亚洲精品| 亚洲成人精品久久| 亚洲色欲色欲综合网站| 亚洲欧洲日韩不卡| 亚洲黑人嫩小videos| 激情内射亚洲一区二区三区| 亚洲高清视频在线观看| 亚洲男人都懂得羞羞网站| 久久久久亚洲AV片无码下载蜜桃| 亚洲AV日韩AV天堂一区二区三区| 亚洲日韩精品一区二区三区无码| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 国产成人福利免费视频| 2021精品国产品免费观看| 91免费福利精品国产| 亚洲最大免费视频网| 91频在线观看免费大全| 国产美女在线精品免费观看| 青青青青青青久久久免费观看| 精品国产免费观看久久久| 一本色道久久88综合亚洲精品高清| 四虎亚洲国产成人久久精品| 久久久久国产成人精品亚洲午夜| 亚洲午夜无码久久久久| 午夜影视日本亚洲欧洲精品一区|