1. 類繼承
可以使用一個已經(jīng)存在的類做為基類-Base class.新類為派生類-derivedclass.
Class DerivedClasss : BaseClass?
{ ……}
派生類擴(kuò)展基類,因?yàn)樗嘶惓蓡T铐料。
派生類不能刪除它所繼承的任何成員染坯。
2. 訪問繼承的成員
測試派生類使用基類成員寓免。
class myBaseClass //基類
? ? {
? ? ? ? public string Field1 = "Base class field";
? ? ? ? public void Method1(string value)
? ? ? ? {
? ? ? ? ? ? Console.WriteLine($"Base class --Method1:{value}");
? ? ? ? }
? ? }
? ? class myDerivedClass:myBaseClass // 派生類
? ? {
? ? ? ? public string Field2 = "Derived class field";
? ? ? ? public void Method2(string value)
? ? ? ? {
? ? ? ? ? ? Console.WriteLine($"Derived class -Method2:{value}");
? ? ? ? }
? ? }
測試代碼:
class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? myDerivedClass myCls = new myDerivedClass();
? ? ? ? ? ? myCls.Method1(myCls.Field1);//基類字段為參數(shù)的基類方法
? ? ? ? ? ? myCls.Method1(myCls.Field2);//派生類字段為參數(shù)的基類方法
? ? ? ? ? ? myCls.Method2(myCls.Field1);//基類字段為參數(shù)的派生類方法
? ? ? ? ? ? myCls.Method2(myCls.Field2);//派生類字段為參數(shù)的派生類方法
? ? ? ? }
? ? }
輸出:
Base class --Method1:Base class field
Base class --Method1:Derived class field
Derived class -Method2:Base class field
Derived class -Method2:Derived class field
3. 所有的類都派生自O(shè)bject
類Object是唯一的非派生類掺炭,因?yàn)樗抢^承層次結(jié)構(gòu)的基礎(chǔ)。
單繼承:一次只能繼承自一個基類
繼承的層次沒有限制驴剔,意思是基類可以派生自另外一個類碟刺。
D <= C <=B <=A <=Object
子類D繼承父類C,類C又是B類的子類除抛,B類又是A類的子類狮杨,A類繼承自O(shè)bject類
4. 屏蔽基類的成員
派生類不能刪除它繼承的任何成員,但是可以使用與成員名稱相同的成員來屏蔽基類成員到忽。
要屏蔽一個繼承數(shù)據(jù)成功橄教,需要聲明一個新的相同類型的同名成員即可。不包含返回類型的喘漏。
使用new 修飾符护蝶,告訴編譯是故意屏蔽繼承的成員的。否則編譯器會警告你隱藏了一個繼承成員翩迈。
修改上測試派生類:
class myDerivedClass:myBaseClass // 派生類
? ? {
? ? ? ? public string Field2 = "Derived class field";
? ? ? ? new public string Field1 = "Derived class field";
? ? ? ? public void Method2(string value)
? ? ? ? {
? ? ? ? ? ? Console.WriteLine($"Derived class -Method2:{value}");
? ? ? ? }
new public void Method1(string value) //屏蔽基類成員函數(shù)
? ? ? ? {
? ? ? ? ? ? Console.WriteLine($"Derived class -Method2:{value}");
? ? ? ? }
? ? }
5. 訪問基類
使用基類訪問 base access 表達(dá)式訪問隱藏的繼承成員持灰。關(guān)鍵字base后跟一個點(diǎn),在加上成員名稱組成
在派生類增加打印字段的方法:
public void PrintField()
? ? ? ? {
? ? ? ? ? ? Console.WriteLine($"Deriverd Field:{ Field1}");
? ? ? ? ? ? Console.WriteLine($"Base Field:{base.Field1}");
? ? ? ? }
測試:
class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? myDerivedClass myCls = new myDerivedClass();
? ? ? ? ? ? myCls.PrintField();
? ? ? ? }
? ? }
輸出:
Deriverd Field:Derived class field
Base Field:Base class field
6. 使用基類的引用
派生類的實(shí)例由基類的實(shí)例加上派生類新增的成員組成负饲。派生類的引用指向整個類對象堤魁,包括基類部分。
class MyBaseClass //基類
? ? {
? ? ? ? public void Print()
? ? ? ? {
? ? ? ? ? ? Console.WriteLine("This is the base class");
? ? ? ? }
? ? }
? ? class MyDerivedClass:MyBaseClass //派生類
? ? {
? ? ? ? new public void Print()
? ? ? ? {
? ? ? ? ? ? Console.WriteLine("This is the derived class");
? ? ? ? }
? ? }
測試:
class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? MyDerivedClass derived = new MyDerivedClass();
? ? ? ? ? ? MyBaseClass Mybase = (MyBaseClass)derived;//轉(zhuǎn)換成基類
? ? ? ? ? ? derived.Print();//從派生類部分調(diào)用Print
? ? ? ? ? ? Mybase.Print();// 從基類部分調(diào)用Print
? ? ? ? }
? ? }
輸出:
This is the derived class
This is the base class
虛方法和重載方法
虛方法可以使基類的引用訪問”升至“派生類內(nèi)返十。
可以使用基類引用調(diào)用派生類的方法:
派生類的方法和基類的方法有相同的簽名和返回類型妥泉。
基類的方法使用virtual 標(biāo)注。
派生類的方法使用override標(biāo)注
在基類中方法被標(biāo)記為virtual洞坑,在派生類中使用override標(biāo)記該方法涛漂,重載基類的方法。
class MyBaseClass
? ? {
? ? ? ? virtual public void Print()
? ? ? ? {
? ? ? ? ? ? Console.WriteLine("This is a base method");
? ? ? ? }
? ? }
? ? class MyDerivedClass:MyBaseClass
? ? {
? ? ? ? public override void Print()
? ? ? ? {
? ? ? ? ? ? Console.WriteLine("This is a Derived Class");
? ? ? ? }
? ? }
測試:
class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? MyDerivedClass derived = new MyDerivedClass();
? ? ? ? ? ? MyBaseClass myBase = (MyBaseClass)derived;
? ? ? ? ? ? derived.Print();
? ? ? ? ? ? myBase.Print();
? ? ? ? }
? ? }
輸出:
This is a Derived Class
This is a Derived Class
重載和被重載的方法必須有相同的可訪問性。不能重載靜態(tài)的方法或非虛方法匈仗。
方法瓢剿,屬性,索引器悠轩,事件都可以被聲明為virtual和override的间狂。
重載標(biāo)記為override的方法
重載方法可以在繼承的任何層次出現(xiàn)。
class MyDerivedClass2 : MyDerivedClass
? ? {
? ? ? ? public override void Print()
? ? ? ? {
? ? ? ? ? ? Console.WriteLine("This is the second derived class");
? ? ? ? }
? ? }
測試:
class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? MyDerivedClass2 derived = new MyDerivedClass2();
? ? ? ? ? ? MyBaseClass myBase = (MyBaseClass)derived;
? ? ? ? ? ? derived.Print();
? ? ? ? ? ? myBase.Print();
? ? ? ? }
? ? }
輸出:
This is the second derived class
This is the second derived class
結(jié)論:無論P(yáng)rint是通過派生類調(diào)用還是通過基類調(diào)用火架,都會調(diào)用最高派生類中的方法鉴象。
使用new 聲明Print
將子類的派生類中的方法聲明為new,則輸出和上情況不同何鸡。
class MyDerivedClass2 : MyDerivedClass
? ? {
? ? ? ? public new void Print()
? ? ? ? {
? ? ? ? ? ? Console.WriteLine("This is the second derived class");
? ? ? ? }
? ? }
測試:
class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? MyDerivedClass2 derived = new MyDerivedClass2();
? ? ? ? ? ? MyBaseClass myBase = (MyBaseClass)derived;
? ? ? ? ? ? derived.Print();
? ? ? ? ? ? myBase.Print();
? ? ? ? }
? ? }
輸出:
This is the second derived class
This is a Derived Class
派生類使用new 覆蓋基類的方法纺弊,通過派生類的實(shí)例調(diào)用時,使用派生列的方法骡男,使用基類的引用調(diào)用時淆游,方法調(diào)用只向上傳遞了一級,使用第一級的子類方法隔盛。
覆蓋其它成員類型
在基類中定義一個屬性:
????????private int _count = 5;
? ? ? ? virtual public int Count
? ? ? ? {
? ? ? ? ? ? get { return _count; }
? ? ? ? }
在派生類中:
private int _count = 10;
?public override int Count => _count;
測試:
派生的Count 屬性和基類引用的Count屬性都輸出10