多型性意味著有多重形式,在面向物件編程范式中,多型性往往表現為"一個介面,多個功能",
多型性可以是靜態的或動態的,在靜態多型性中,函式的回應是在編譯時發生的,在動態多型性中,函式的回應是在運行時發生的,
靜態多型性
在編譯時,函式和物件的連接機制被稱為早期系結,也被稱為靜態系結,C# 提供了兩種技術來實作靜態多型性,分別為:
- 函式多載
- 運算子多載
動態多型性
關鍵字 : Abstract
抽象方法:在基類中定義的并且必須在派生類中重寫的方法,使用 abstract 關鍵字定義,
- 您不能創建一個抽象類的實體,
- 您不能在一個抽象類外部宣告一個抽象方法,
- 通過在類定義前面放置關鍵字 sealed,可以將類宣告為密封類,當一個類被宣告為 sealed 時,它不能被繼承,抽象類不能被宣告為 sealed,
1 namespace FirstCode.EX1 2 { 3 abstract public class Shape 4 { 5 abstract public int area(); 6 } 7 }
1 namespace FirstCode.EX1 2 { 3 public class Rectangle : Shape 4 { 5 public int width; 6 public int length; 7 8 public Rectangle(int a,int b) 9 { 10 width =a; 11 length = b; 12 } 13 public override int area()=>width*length; 14 15 } 16 }
1 namespace FirstCode 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Rectangle rect1 = new Rectangle(2,3); 8 Console.WriteLine("矩形的面積:"+rect1.area().ToString()); 9 } 10 } 11 }

關鍵字:Virtual
虛方法:即為基類中定義的允許在派生類中重寫的方法,使用virtual關鍵字定義,
注意:虛方法也可以被直接呼叫,
1 namespace FirstCode.EX2 2 { 3 public class Shape 4 { 5 public virtual void Drawing() 6 { 7 Console.WriteLine("執行基類的畫圖任務"); 8 } 9 } 10 }
1 namespace FirstCode.EX2 2 { 3 public class Rectangle : Shape 4 { 5 public override void Drawing() 6 { 7 System.Console.WriteLine("畫一個矩形"); 8 base.Drawing(); 9 } 10 } 11 }
1 namespace FirstCode.EX2 2 { 3 public class Circle:Shape 4 { 5 public override void Drawing() 6 { 7 System.Console.WriteLine("畫一個圓"); 8 base.Drawing(); 9 } 10 } 11 }
1 namespace FirstCode 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 EX2.Rectangle rect2 = new EX2.Rectangle(); 8 rect2.Drawing(); 9 10 EX2.Circle circle2= new Circle(); 11 circle2.Drawing(); 12 } 13 } 14 }

隱藏方法:在派生類中定義的和基類中的某個方法同名的方法,使用 new 關鍵字定義,
注意:
- (1)隱藏方法不但可以隱藏基類中的虛方法,而且也可以隱藏基類中的非虛方法,
- (2)隱藏方法中父類的實體呼叫父類的方法,子類的實體呼叫子類的方法,
- (3)和上一條對比:重寫方法中子類的變數呼叫子類重寫的方法,父類的變數要看這個父類參考的是子類的實體還是本身的實體,如果參考的是父類的實體那么呼叫基類的方法,如果參考的是派生類的實體則呼叫派生類的方法,
關系和區別:
動態多型性是通過 抽象類 和 虛方法 實作的,
virtual和abstract都是用來修飾父類的,通過覆寫父類的定義,讓子類重新定義,
- 1.virtual修飾的方法必須有實作(哪怕是僅僅添加一對大括號),而abstract修飾的方法一定不能實作,
- 2.virtual可以被子類重寫,而abstract必須被子類重寫,
- 3.如果類成員被abstract修飾,則該類前必須添加abstract,因為只有抽象類才可以有抽象方法,
- 4.無法創建abstract類的實體,只能被繼承無法實體化,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/73219.html
標籤:C#
下一篇:linq修改的資料沒效果
