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

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

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

    靈魂-放水

    為學(xué)日益,為道日損。

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks
    為什么在C#中inner class不能夠訪問外部類的非靜態(tài)成員,如下面的一段代碼就存在這樣的問題:

    public class TestOuter

    {

    public static void outer(){}

    public void outer2(){}



    internal class A

    {

    public voidtest()

    {

    outer(); // 可以調(diào)用外部靜態(tài)方法,無法調(diào)用實例方法

    outer2(); // 本句無法通過編譯

    }

    }

    }

    在Java中,下面的代碼是可以很正常的使用的:

    public class testinner

    {

    static public void Main(String[] args)

    {

    testinner tester = new testinner();

    testinner.Inner inner = tester.new Inner();

    inner.testinner();

    }

    public void test(){ }



    class Inner

    {

    public void testinner()

    {

    test();

    }

    }

    }



    對比之下,C#中的內(nèi)部類能夠使用外部類定義的類型和靜態(tài)方法,但是不能直接使用外部類的實例方法,直接看來,外部類對于內(nèi)部類的作用更像是一個命名空間,在C#中,始終可以用(只要訪問控制允許)

    TestOuter.A instance = new TestOuter.A();

    來創(chuàng)建一個內(nèi)部類的實例,這個實例與外部類的任何實例沒有任何直接的關(guān)系。類似于Java中的靜態(tài)內(nèi)部類。

    Java中,非靜態(tài)內(nèi)部類可以訪問所有外部類的方法和變量。所以Java中的內(nèi)部類的構(gòu)造也依賴于外部類,必須使用如:

    Outer.Inner inner = outer.new Inner();

    這樣的語法來定義內(nèi)部類的實例以確保他與某一確定的外部類的對象相對應(yīng)。

    而在C#中,類區(qū)分為Nested Class和Not-Nested Class,前者是聲明在其他數(shù)據(jù)類型內(nèi)部的類。后者是直接定義在某一個命名空間的類。

    非內(nèi)嵌類只允許使用public和internal的訪問控制,而內(nèi)置類則允許使用所有的五種訪問控制符,private, protected , internal protected。內(nèi)部類也可以訪問外部類的所有方法,包括instance方法和private方法,但是需要顯式的傳遞一個外部類的實例。

    如:

    public class TestOuter

    {

    public void outer2(){}



    internal class A

    {

    public A(TestOuter obj)

    {

    Outer_this = obj

    }

    public void test()

    {

    obj.outer2();

    }

    TestOuter Outer_this;

    }

    }

    C#這樣做的原因,主要是為了避免outer.new 這樣的語法,保持一致的對象創(chuàng)建方式。雖然相比于Java需要創(chuàng)建一個新的方法和變量,但是對象的創(chuàng)建過程更加直接,而且避免了隱含的內(nèi)部類與外部類的實例之間的關(guān)系。

    如果分析到CLR的實現(xiàn)層面,我們也可以知道,C#的內(nèi)部類應(yīng)該并沒有包含外部類的虛函數(shù)表,而僅僅包含了靜態(tài)方法表,所有對外部類的方法的調(diào)用時通過外部類指針作的。具體的機(jī)制可能更復(fù)雜。但是除此以外,內(nèi)部類并沒有被作為一種特殊的類型處理,而是必須與其他普通的對象采取一樣的機(jī)制進(jìn)行創(chuàng)建。

    C#的內(nèi)部類提供了覆蓋的功能,在一個包含了內(nèi)部類的類的子類中可以用關(guān)鍵字new 來覆蓋同名內(nèi)部類的實現(xiàn)。

    如:

    class A1

    {

    class B1 { }

    }

    class A2 : A1

    {

    new class B1 { }

    }

    C#中的內(nèi)部類會覆蓋同名的外部類的方法。如果上面的A1中定義任何名為B1()的方法,該方法將被覆蓋。



    內(nèi)部類使用的一些General Information:

    創(chuàng)建內(nèi)部類的一個目的是為了抽象外部類的某一狀態(tài)下的行為,或者內(nèi)部類僅在外部類的某一特定上下文存在。或是隱藏實現(xiàn),通過將內(nèi)部類設(shè)為private,可以設(shè)置僅有外部類可以訪問該類。內(nèi)部類的另外一個重要的用途是當(dāng)外部類需要作為某個特定的類工作,而外部類已經(jīng)繼承與另外一個類的時候,因為Java不支持多繼承,所以創(chuàng)建一個對應(yīng)的內(nèi)部類作為外部類的一個fa&ccedil;ade來使用。

    通常,創(chuàng)建內(nèi)部類的動機(jī)都是上面中的其中之一或者幾項。而其中最常見的目的莫過于前兩項。

    我們看一下Java中處理事件的代碼:

    public class Demo1 extends JPanel

    {

    class IconDemo implements Icon {}

    }

    這個例子對應(yīng)了上面的第一種動機(jī),即封裝特定狀態(tài)或特定實現(xiàn)的動機(jī)。IconDemo僅在的Demo1中使用,對應(yīng)特定的圖標(biāo)繪制行為。

    常見的另外一個場合是需要自定義Action的行為,我們可能有如下的類:

    public class Demo1 extends JPanel implements ActionListener

    {

    private JMenuItem item1;

    void foo()

    {

    Item1 = new JMenuItem(“test” , new TestAction(“some action”));

    }

    Private TestAction extends AbstractAction

    {

    //code goes here

    }

    }

    這種情況下,TestAction可以看成是一種特化的要求。



    隱藏實現(xiàn)的需求往往對應(yīng)于內(nèi)部抽象,或者二次抽象(Secondary Abstraction),它對應(yīng)著對于類內(nèi)部的部分行為進(jìn)一步抽象,聚簇。常見的一種情況是在內(nèi)部類中創(chuàng)建私有的結(jié)構(gòu),用于抽象盡在類的內(nèi)部使用的數(shù)據(jù)結(jié)構(gòu)。



    而作為Fa&ccedil;ade使用的情況相當(dāng)于外部類作為內(nèi)部類的創(chuàng)建工廠,當(dāng)外部請求需要外部類提供一個它不能夠繼承的基類或接口的時候,外部類產(chǎn)生一個內(nèi)部類的實例對象,返回給相應(yīng)的請求。



    創(chuàng)建內(nèi)部類的一些原則:

    如果一下一些情況出現(xiàn),避免使用內(nèi)部類:

    內(nèi)部類的功能過分膨脹影響了對外部類的閱讀

    內(nèi)部類內(nèi)部包含內(nèi)部類,對代碼的可讀性影響很大

    內(nèi)部類可以不依賴于外部類被使用,在這種情況下,說明內(nèi)部類與外部類的抽象沒有包含關(guān)系,則應(yīng)該將內(nèi)部類作為一種獨立的抽象設(shè)計為另外一個外部類。(可以參考內(nèi)部類設(shè)計的第二目的,內(nèi)部抽象)



    注:在VC中可以使用內(nèi)部類作為模版的局部特化處理,掠過不提。其實我也不太懂,:)
    posted on 2007-02-01 13:48 放水老倌 閱讀(410) 評論(0)  編輯  收藏 所屬分類: .NET
    主站蜘蛛池模板: 国产啪精品视频网站免费尤物 | 免费国产a国产片高清网站| 日韩大片在线永久免费观看网站| 久久久久亚洲AV无码专区桃色 | 亚洲AV无码乱码在线观看性色扶| 永久免费不卡在线观看黄网站| 亚洲无人区码一二三码区别图片| 精品亚洲成α人无码成α在线观看 | 无码国产精品一区二区免费16 | 亚洲精品无码久久久久sm| 麻豆国产精品免费视频| 免费无码专区毛片高潮喷水 | 九九全国免费视频| 亚洲综合色区中文字幕| 亚洲精品高清一二区久久| 91九色精品国产免费| 久久国产免费直播| 亚洲入口无毒网址你懂的| 亚洲色中文字幕无码AV| 成人免费一区二区无码视频| a毛片全部播放免费视频完整18| 亚洲乱码在线观看| 久久91亚洲精品中文字幕| 免费一级毛片在线观看| 福利免费观看午夜体检区| 久久免费公开视频| 日韩毛片一区视频免费| 亚洲午夜一区二区三区| 亚洲AV色香蕉一区二区| 亚洲国产电影av在线网址| 女人18毛片水真多免费看| 99精品视频在线免费观看| 亚洲免费在线观看| 美女黄频a美女大全免费皮| 亚洲乱码一区二区三区国产精品| 亚洲综合久久久久久中文字幕| 久久国产成人亚洲精品影院| 国产禁女女网站免费看| 毛片免费vip会员在线看| 久久永久免费人妻精品下载| 最近的2019免费中文字幕|