標籤:blog 使用 ar sp div on log 代碼 ad
2.1 實現繼承和介面繼承
實現繼承:一個類型派生於一個基底類型,它用於基底類型的所有成員欄位和函數.
class BaseClass { public string UserName = "C#"; public static string GetUserName() { return ""; } } class ImpleteClass:BaseClass { public string PrintName() { return GetUserName(); //return UserName } }
ImpleteClass類繼承BaseClass,就可以用基類中所有的成員欄位如UserName,GetUserName();
介面繼承 表示一個類型只繼承了函數的簽名,沒有繼承任何實現代碼.在需要制定該類型具有某些可用的特性時,最好
使用這種類型的繼承.
2.2 多重繼承
C#不支援多重實現繼承.但C#允許類型派生自多個介面---多重介面繼承.這說明
C#類可以派生自另一個類和任意多個介面.
2.3 Virtual關鍵字
virtual 關鍵字用於在基類中修飾方法。virtual的使用會有幾種情況:
1, 如果方法不是virtual的,編譯器就使用聲明的類對應的類型,也就是說,不是virtual的,在編譯時間候,就定了。比如下面的例子:子類的方法都沒有執行,執行的全部都是父類的方法。啟動並執行結果是
father
boy
girl
public class ClassFather { public string s1; public void VirFun() { Console.WriteLine(s1); } } public class ClassBoy : ClassFather { public new void VirFun() { base.VirFun(); } } public class ClassGirl : ClassFather { public new void VirFun() { base.VirFun(); Console.WriteLine(s1); } } public class Test { public static void Main() { ClassFather a = new ClassFather(); a.s1 = "father"; a.VirFun(); ClassFather b = new ClassBoy(); b.s1 = "boy"; b.VirFun(); ClassFather c = new ClassGirl(); c.s1 = "girl"; c.VirFun(); Console.ReadKey(); } }
2, 如果方法是Virtual的,然後子類使用了override, 編譯器就生產代碼。然後,在啟動並執行時候,進行檢測,看對象屬於哪個類,然後調用這個類的方法。啟動並執行結果是
father
boy
girl
girl
public class ClassFather { public string s1; public virtual void VirFun() { Console.WriteLine(s1); } } public class ClassBoy : ClassFather { public override void VirFun() { base.VirFun(); } } public class ClassGirl : ClassFather { public override void VirFun() { base.VirFun(); Console.WriteLine(s1); } } public class Test { public static void Main() { ClassFather a = new ClassFather(); a.s1 = "father"; a.VirFun(); ClassFather b = new ClassBoy(); b.s1 = "boy"; b.VirFun(); ClassFather c = new ClassGirl(); c.s1 = "girl"; c.VirFun(); Console.ReadKey(); } }
3,如果一個父類的方法是virtual,子類不是用override,而是用new來覆蓋了,那麼運行子類的時候,還是執行聲明的類的方法。比如下面的例子中,girl類對象就是。
father
boy
girl
public class ClassFather { public string s1; public virtual void VirFun() { Console.WriteLine(s1); } } public class ClassBoy : ClassFather { public new void VirFun() { base.VirFun(); } } public class ClassGirl : ClassFather { public new void VirFun() { base.VirFun(); Console.WriteLine(s1); } } public class Test { public static void Main() { ClassFather a = new ClassFather(); a.s1 = "father"; a.VirFun(); ClassFather b = new ClassBoy(); b.s1 = "boy"; b.VirFun(); ClassFather c = new ClassGirl(); c.s1 = "girl"; c.VirFun(); Console.ReadKey(); } }
飄過來學C#系列(2)之------繼承