深入理解C# abstract和virtual關鍵字

來源:互聯網
上載者:User

複製代碼 代碼如下:class A
{
public virtual void Func() // 注意virtual,表明這是一個虛擬函數
{
Console.WriteLine("Func In A");
}
}
class B : A // 注意B是從A類繼承,所以A是父類,B是子類
{
public override void Func() // 注意override ,表明重新實現了虛函數
{
Console.WriteLine("Func In B");
}
}
class C : B // 注意C是從B類繼承,所以B是父類,C是子類
{
}
class D : A // 注意D是從A類繼承,所以A是父類,D是子類
{
public new void Func() // 注意new ,表明覆蓋父類裡的同名類,而不是重新實現
{
Console.WriteLine("Func In D");
}
}
class Program
{
static void Main(string[] args)
{
A a; // 定義一個a這個A類的對象.這個A就是a的申明類
A b; // 定義一個b這個A類的對象.這個A就是b的申明類
A c; // 定義一個c這個A類的對象.這個A就是c的申明類
A d; // 定義一個d這個A類的對象.這個A就是d的申明類
a = new A(); // 執行個體化a對象,A是a的執行個體類
b = new B(); // 執行個體化b對象,B是b的執行個體類
c = new C(); // 執行個體化c對象,C是c的執行個體類
d = new D(); // 執行個體化d對象,D是d的執行個體類
a.Func(); // 執行a.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉去檢查執行個體類A,就為本身 4.執行執行個體類A中的方法 5.輸出結果 Func In A
b.Func(); // 執行b.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉去檢查執行個體類B,有重載的 4.執行執行個體類B中的方法 5.輸出結果 Func In B
c.Func(); // 執行c.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉去檢查執行個體類C,無重載的 4.轉去檢查類C的父類B,有重載的 5.執行父類B中的Func方法 5.輸出結果 Func In B
d.Func(); // 執行d.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉去檢查執行個體類D,無重載的(這個地方要注意了,雖然D裡有實現Func(),但沒有使用override關鍵字,所以不會被認為是重載) 4.轉去檢查類D的父類A,就為本身 5.執行父類A中的Func方法 5.輸出結果 Func In A
D d1 = new D();
d1.Func(); // 執行D類裡的Func(),輸出結果 Func In D
Console.ReadLine();
}
}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.