C#每日一課(十八)
C# 多型性
多型性,意味著有多重形式。在面向物件程式設計中,多型一般的表現形式是“一個介面,多個功能實現”。
多型性分為靜態的或動態的,靜態多型表示函式的響應是在編譯時發生的。動態多型則函式的響應是執行時發生的。
靜態多型性
在編譯時,函式和物件的連線機制被稱為早期繫結,也被稱為靜態繫結。C#中提供了兩種方式實現
1.函式過載
2.運算子過載
函式過載
在同一個範圍內對相同的函式名有多個定義。注意函式的定義必須要彼此不同,可以是引數型別不同,也可以引數不同(特別注意:只有返回型別不同的函式宣告不可以過載)。
使用Visual Studio新建專案chapter13_001
在類中新增過載函式:
//過載函式Print void Print(int i) { Console.WriteLine("int:{0}", i); } void Print(double d) { Console.WriteLine("double:{0}", d); } void Print(string s) { Console.WriteLine(s); }
在Main方法做中做如下呼叫
Printdata pd = new Printdata(); //呼叫Print函式 pd.Print("--------過載函式Print呼叫-------"); pd.Print("輸出int值"); pd.Print(10); pd.Print("輸出double值"); pd.Print(0.1); pd.Print("輸出string值"); pd.Print("C#"); Console.ReadKey();
編譯執行後結果如下:
動態多型性
C#中可以使用abstract建立抽象類,用於提供介面的部分類的實現。當一個派生類繼承自這個抽象類時,實現即完成。抽象類包含抽象方法,抽象方法可以被派生類實現,在派生類中可以根據具體派生出來的類形成列合適更專業的實現。
關於抽象類的一些規則
- 不可以建立一個抽象類的例項
- 不可以在一個抽象類的外部宣告一個抽象方法
- 通過在類定義前面加上關鍵字sealed把類宣告為密封類,當一個類被宣告為sealed後則不可以被繼承,抽象類因為存在抽象方法又不可以例項化一定要派生子類的所以抽象類是不可以宣告為sealed的。
新增一個抽象類:Person
abstract class Person
{
public abstract void Todo();
}
這裡Todo是一個抽象方法
新增一個派生類Student,它繼承抽象類Person,並在類中過載抽象方法Todo
class Student : Person
{
public override void Todo()
{
Console.WriteLine("學生學習!");
}
}
新增一個派生類Teacher,它繼承抽象類Person,並在類中過載抽象方法Todo
class Teacher : Person
{
public override void Todo()
{
Console.WriteLine("教師教書!");
}
}
在Main方法中新增如下程式碼:
pd.Print("-------------過載抽象方法--------------");
Student stu = new Student();
stu.Todo();
Teacher t = new Teacher();
t.Todo();
編譯執行後結果如下:
當有一個定義在類中的函式需要在繼承中實現時,可以使用虛方法,虛方法使用關鍵字virtual,虛方法可以在不同的繼承類中有不同的實現。對虛擬方法中的呼叫在執行時進行的。
可以把上面的Perosn類不定義為abstract類,可以把要在繼承類中實現的程式碼寫為虛方法:
Person類改造後如下:
class Person
{
public virtual void Todo()
{
Console.WriteLine("父類中的Todo方法");
}
}
另個兩個派生類不改變的情況下會得到和使用抽象類一樣的結果。
動態多型性是在執行時來確定最終的實現方式是什麼,可以通過抽象類和虛方法來實現。