理解C#中介面的永久可重寫性

來源:互聯網
上載者:User

考慮這樣一個問題,一個類型執行一個介面的方法,這個方法沒有修飾virtual,那麼這個類型的子類還可以修改這個介面的執行方法嗎?答案是永遠可以,並且無論介面是顯示執行還是隱式執行,總是可以改寫的。

 

來看下面代碼,一個介面,一個父類,一個子類,子類繼續執行父類已經執行的介面方法定義。

interface IA

{

    void doo();

}

 

class A : IA

{

    public void doo()

    {

        Console.WriteLine("A");

    }

}

 

//繼續執行IA

class B : A, IA

{

    public new void doo()

    {

        Console.WriteLine("B");

    }

}

 

然後運行代碼,分別把子類對象b轉換成介面,父類最後先轉換成父類在轉換成介面(其實就等於直接轉換成介面),接著調用doo方法。

var b = new B();

((IA)b).doo();

((A)b).doo();

((IA)(A)b).doo();

 

 

結果是:

B

A

B

 

父類的doo方法當然不可能變,因為他不是virtual況且我們也沒有override,而介面執行則變了。

 

當然如果你不在B類中執行IA介面:

class B : A

{

    public new void doo()

    {

        Console.WriteLine("B");

    }

}

 

那麼輸出顯而易見會全是A,因為輸出B的doo方法僅僅是在B類型層次上的一個獨立的方法。

 

簡單的講,C#在匹配介面執行目標會優先從子類,然後是父類(當然前提是子類也執行了這個介面),同時顯示介面執行要優先於隱式的介面名稱匹配。

 

C# Language Specification也有相應的說明,可以參考:http://msdn.microsoft.com/en-us/library/aa664592(v=vs.71).aspx

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.