一、繼承
什么是繼承:繼承是允許重用現有類去創建新類的過程。分類的原則是一個類派生出來的子類具有這個類的所有非私有的屬性。
1、繼承 C# 中的類:C#不支持多重繼承,C#類始終繼承自一個基類(如果未在聲明中指定一個基類,則繼承自System.Object)。
1、繼承 C# 中的類:C#不支持多重繼承,C#類始終繼承自一個基類(如果未在聲明中指定一個基類,則繼承自System.Object)。
派生類繼承基類的語法如下:
1 using System; 2 public class Person 3 { 4 //這是基類 5 } 6 public class Student:Person 7 { 8 //這是派生類 9 }
注:派生類繼承基類時用“:”符號連接,派生類繼承基類的所有非私有成員變量和方法。
2、調用基類的構造函數:
如果對類沒有定義顯式構造函數,則編譯器將提供默認的構造函數,以初始化這些類的成員字段。但是,如果顯式添加了構造函數,就可以有效控制整個構造過程。
示例:
1 using System; 2 namespace Jicheng 3 { 4 //基類 5 public class Person 6 { 7 public string _name; 8 public uint _age; 9 //基類的構造函數 10 public Person(string name,uint age) 11 { 12 this._name = name; 13 this._age = age; 14 //打印輸出 15 Console.WriteLine(_name); 16 Console.WriteLine(_age); 17 } 18 } 19 //派生類 20 public class Student:Person 21 { 22 private uint _id; 23 //派生類構造函數並調用基類構造函數用“:base” 24 public Student(string name,uint age uint id):base(name,age) 25 { 26 this._id = id; 27 //打印輸出 28 Console.WriteLine(_id); 29 } 30 } 31 public class Exercise 32 { 33 [STAThread] 34 static void Main(string[] args) 35 { 36 //構造 Student 37 Student objstudent=new Student(“XYZ”,45,001); 38 } 39 } 40 }
注:派生類通過使用:base()語法可以顯式調用基類的構造函數。在必要的情況下,可以利用它來初始化字段。
二、
C#
中的方法重寫
關鍵字: override
override關鍵字用於修改方法,具有override關鍵字修飾符的方法是對基類中同名方法的新實現,基類中的同名方法必須聲明為virtual或abstract類型。給基類中的方法添加virtual關鍵字表示可以在派生類中重寫它的實現。
1、默認的C#方法並非virtual,因此不能重寫。
2、基類方法的可訪問級別並不因重寫它的方法而改變,他們的訪問修飾符相同。
3、new、static和virtual關鍵字不能與override訪問修飾符一同使用
關鍵字: virtual
C#中提供virtual關鍵字,用於將方法定義為支持多態,用於對一個類中可修改的方法的聲明,這種方法稱為虛擬方法,字類可以使用override關鍵字自由實現它們各自版本的虛擬方法
語法:
[訪問修飾符] virtual [返回值類型] 方法名稱([參數列表])
{
//虛擬方法的實現
}
1、virtual訪問修飾符不能與static和override等訪問修飾符一同使用
2、調用虛擬方法,在運行時系統會自動檢查,以確定調調用了哪一個實現方法。
關鍵字: new
new訪問修飾符用於顯式隱藏繼承自基類的成員,如果派生類成員與基類成員名稱相同,new會將派生類成員識別為一個全新成員。
1、在一個方法中同時使用new和override將會出錯。
2、new訪問修飾符的真正目的是為了隱藏基類方法。
3、如果將一個方法聲明為new,它實際上並沒有隱藏基類方法,並且編譯器也產生了警告,這時應該刪除new。
關鍵字: override
override關鍵字用於修改方法,具有override關鍵字修飾符的方法是對基類中同名方法的新實現,基類中的同名方法必須聲明為virtual或abstract類型。給基類中的方法添加virtual關鍵字表示可以在派生類中重寫它的實現。
1、默認的C#方法並非virtual,因此不能重寫。
2、基類方法的可訪問級別並不因重寫它的方法而改變,他們的訪問修飾符相同。
3、new、static和virtual關鍵字不能與override訪問修飾符一同使用
關鍵字: virtual
C#中提供virtual關鍵字,用於將方法定義為支持多態,用於對一個類中可修改的方法的聲明,這種方法稱為虛擬方法,字類可以使用override關鍵字自由實現它們各自版本的虛擬方法
語法:
[訪問修飾符] virtual [返回值類型] 方法名稱([參數列表])
{
//虛擬方法的實現
}
1、virtual訪問修飾符不能與static和override等訪問修飾符一同使用
2、調用虛擬方法,在運行時系統會自動檢查,以確定調調用了哪一個實現方法。
關鍵字: new
new訪問修飾符用於顯式隱藏繼承自基類的成員,如果派生類成員與基類成員名稱相同,new會將派生類成員識別為一個全新成員。
1、在一個方法中同時使用new和override將會出錯。
2、new訪問修飾符的真正目的是為了隱藏基類方法。
3、如果將一個方法聲明為new,它實際上並沒有隱藏基類方法,並且編譯器也產生了警告,這時應該刪除new。
三、抽象類和抽象方法
什么是抽象類:abstract關鍵字修飾的類稱為抽象類,抽象類不能被實例化,抽象類是派生類的基類。
關鍵字:abstract
語法:
abstract class 類名
{
…………
}
1、一個抽象類可以同時包含抽象方法和非抽象方法。
2、抽象方法只在派生類中真正實現,這表明抽象方法只存放函數原型,不涉及主體代碼,
3、派生自抽象類的類需要實現其基類的抽象方法,才能實例化對象。
4、使用override關鍵子可在派生類中實現抽象方法,經override聲明重寫的方法稱為重寫基類方法,其簽名必須與override方法的簽名相同。
示例:
什么是抽象類:abstract關鍵字修飾的類稱為抽象類,抽象類不能被實例化,抽象類是派生類的基類。
關鍵字:abstract
語法:
abstract class 類名
{
…………
}
1、一個抽象類可以同時包含抽象方法和非抽象方法。
2、抽象方法只在派生類中真正實現,這表明抽象方法只存放函數原型,不涉及主體代碼,
3、派生自抽象類的類需要實現其基類的抽象方法,才能實例化對象。
4、使用override關鍵子可在派生類中實現抽象方法,經override聲明重寫的方法稱為重寫基類方法,其簽名必須與override方法的簽名相同。
示例:
1 using System; 2 namespace Example_5 3 { 4 //抽象類 5 abstract class ABC 6 { 7 //抽象方法 8 public abstract void Afunc(); 9 } 10 //派生類 11 class Derv:ABC 12 { 13 //實現抽象類中的抽象方法 14 public override void Afunc() 15 { 16 Console.WriteLine(“實現抽象方法”); 17 } 18 } 19 public class Test 20 { 21 static void Main(string[] args) 22 { 23 Derv obj=new Derv(); 24 obj.Afunc(); 25 } 26 } 27 }
5、基類實現抽象類,則派生類不需要重新實現該抽象類。
6、抽象類並不僅僅只是一種實現技巧,它更代表一種抽象的概念,從而為所有的派生類確立一種約定。
6、抽象類並不僅僅只是一種實現技巧,它更代表一種抽象的概念,從而為所有的派生類確立一種約定。
四、接口
關鍵字:interface
語法:
修飾符 interface 接口名
{
//接口主體
}
1、一個接口就相當於一個抽象類,但是它不能包含任何實現方法。
2、接口的每種方法都必須在派生類中實現。
3、接口有時候可以看成是類的模具,它指明一個類該提供哪些內容。
4、接口主體只限於方法、索引器、屬性的聲明。
5、接口中不能包含字段、構造函數和常量等。
6、接口成員是隱式公開的,如果對其顯式指定訪問級別,就會出現編譯器錯誤。
7、在接口中不能實現任何方法,屬性或者索引器。
8、在指定方法時,只需給出返回類型、名稱和參數列表,然后以分號結束。
9、實現接口的語法與實現繼承一樣,都用冒號“:”
示例:
關鍵字:interface
語法:
修飾符 interface 接口名
{
//接口主體
}
1、一個接口就相當於一個抽象類,但是它不能包含任何實現方法。
2、接口的每種方法都必須在派生類中實現。
3、接口有時候可以看成是類的模具,它指明一個類該提供哪些內容。
4、接口主體只限於方法、索引器、屬性的聲明。
5、接口中不能包含字段、構造函數和常量等。
6、接口成員是隱式公開的,如果對其顯式指定訪問級別,就會出現編譯器錯誤。
7、在接口中不能實現任何方法,屬性或者索引器。
8、在指定方法時,只需給出返回類型、名稱和參數列表,然后以分號結束。
9、實現接口的語法與實現繼承一樣,都用冒號“:”
示例:
1 interface Icustomer 2 { 3 ……………… 4 } 5 public class MyClass: Icustomer 6 { 7 ……………… 8 }
10、接口中的方法不能重寫,只能實現。
編碼標准:
接口名稱需始終冠以大寫字母I
編碼標准:
接口名稱需始終冠以大寫字母I
五、多重接口實現
C#中多重接口的實現,彌補了C#只能單一繼承,不能多重繼承的缺點。
語法示例:
C#中多重接口的實現,彌補了C#只能單一繼承,不能多重繼承的缺點。
語法示例:
1 public intetface IName 2 { 3 void Name(); 4 } 5 public interface IAge 6 { 7 void Age(); 8 } 9 public class Consoleshow: IAge, IName 10 { 11 public void Name() 12 { 13 //具體實現 14 } 15 public void Age() 16 { 17 //具體實現 18 } 19 }
六、顯式接口實現
如果兩個接口中有完全相同的簽名,那么可以用“接口名.方法名”的方法顯式的來實現接口。
示例:
1 public interface Iname 2 { 3 void Test(); 4 } 5 public interface Iage 6 { 7 void Test(); 8 } 9 public Test: Iname, Iage 10 { 11 void Iname Test() 12 { 13 // Iname借口的實現 14 } 15 void Iage Test() 16 { 17 // Iage借口的實現 18 } 19 20 }
七、接口繼承
通過合並其他接口,也可以新建接口。用於合並接口的語法與繼承的語法非常相似,只是前者可以將多個接口合並成一個。一個類要實現一個接口,必須為基接口和派生接口的所有成員編寫實現代碼。
