繼承
1.繼承
a。.直接在類的后面加上冒號“:”后面跟基類,就該類就繼承了基類的一切特性了。
b。private類不能被繼承,只有public、protected類能被繼承。
c。private類不里面所有的屬性和方法都不能被外界訪問,只有他自己可以。
d。public類可以被外界訪問和繼承。
e。protected類可以被繼承,外界不能訪問,但是子類可以訪問。
f。c#不能多重繼承,就是說一個類只能繼承一個類,不能同時繼承多個類。要實現多繼承就需要用接口來實現。
g.對于繼承來說。不允許派生類的訪問性比其基類的更高。也就是說,內部類可以繼承于一個公共類,但公共類不能繼承一個內部類。
注:1.訪問性相同的類,可以相互繼承。
2.系統默認的是內部類(interior關鍵字修飾),所以我們在定義基類時,需要加上public或protected
h.如果指定了基類,它必須緊跟在繼承類冒號的后面,之后才是指定的接口。如果沒有指定基類,則接口就跟在冒號的后面。
注:如果一個類即實現某個接口又繼承某個類,那么所繼承的類的類名要寫在最前面,接口跟在繼承類的后面,如:public class 普通類:基類名,接口1,接口2
不能寫成public class 普通類:接口1,基類名,接口2
?
?
2.多態(覆載)
???? 多態是指兩個或多個屬于不同類的對象,對同一個消息做出不同的響應的能力。
實現多態時必須在將該方法定義成虛函數,用virtual定義虛函數。在重寫虛函數時還要在重寫的前面加上override(覆載)來申明一個覆載方法,然后用base關鍵字來告訴程序方法是基類的方法。
public class person
??? {
??????? private string name;
??????? private string adress;
??????? //這里和繼承哪里的一樣,這里就省了
public virtual void print()//用virtual將print()方法定義為虛方法(虛函數);
??????? {
3行: ????Console.WriteLine("姓名: " + Name + "\n" + "地址" + Adress);
??????? }
}
public? class Student:person
??? {
??????? private string studentId;//定義一個字段
??????? //這里是studentId的訪問器,此處忽略
????? public override void print()//用override來重寫一個方法
?? ?// public new void print() //用new來防止隱藏了父類的方法,但注意的是在客戶端需要用基類的類名來實例化子類的對象。
??????? {
2行:?????? base.print();????? //用base關鍵字來告訴程序這里的print()是基類中的,當前這個print()
4行:?????? Console.WriteLine("學號" + StudenId+"\n");
??????? }
}
class Program
??? {
??????? static voidMain(string[] args)
??????? {
??????????? Student s = new Student();
??????????? s.Name = "報文";
??????????? s.Adress = "云南農業大學";?????????
? 1行:? ???s.print();//調用自己類中的方法
????????? /* //用基類名來實例化子類。如果調用了子類中用new方法的話,那么就不會覆蓋基類中的方法。
Person? p=new Program();
?????? ????p.print();
*/
?????????? Console.Read();
??????? }
??? }
步驟說明:執行到第1行時,當然是先調用自己類中的東西,如果自己類中沒有,然后才會到基類中去找的,所以執行第1行后他調用了自己類中的print(),然后執行第2行,第2行調用基類中的print(),調用完后回來繼續執行第4行。
說明:基類中有一個print()方法,子類中也有一個print()方法,在基類方法前面加上virtual表示定義了一個虛方法,然后在子類中通過override來覆載基類中的print()方法,這也就是重寫了。然后通過base來調用基類中的print()。
注:1.通過這樣的方式就可以省去既要調用基類中的方法又要調用自己類中的方法,如果子類中的方法只是想在基類的方法中擴大或縮小或其他一些和基類中的方法有關的操作就不用重新再定義了。
如,基類中的方法是Num(){? return 3 ;} 在子類中的Num(){ return base.Num()*3}
就不在重新寫了,直接改變調用基類中的方法來改變。
2.在重寫方法或屬性的前面加override是覆載基類的方法或屬性,如果用new的話,然后在創建對象時用基類來創建子類的對象,那么基類中的方法或屬性就不會被覆蓋掉。