C#改寫方法學習筆記
C#改寫方法
面向對象設計的重要原則就是多態性。不要理會高深的理論,多態性意味著:當基類程序員已設計好用于改寫的方法時,在派生類中,你就可以重定義(改寫)基類的方法。基類程序員可以用 virtual 關鍵字設計方法:
- virtual void CanBOverridden()
當從基類派生時,所有你要做的就是在新方法中加入override關鍵字:
- override void CanBOverridden()
當改寫一個基類的方法時,你必須明白,不能改變方法的訪問屬性——在這章的后面,你會學到更多關于訪問修飾符的知識。
除了改寫基類方法的事實外,還有另一個甚至更重要的改寫特性。當把派生類強制轉換成基類類型并接著調用虛擬方法時,被調用的是派生類的方法而不是基類的方法。
- ((BaseClass)DerivedClassInstance)。CanBOverridden();
為了演示虛擬方法的概念,顯示如何創建一個三角形基類,它擁有一個可以被改寫的成員方法(ComputeArea)。
- using System;
- class Triangle
- {
- public virtual double ComputeArea(int a, int b, int c)
- {
- // Heronian formula
- double s = (a + b + c) / 2.0;
- double dArea = Math.Sqrt(s*(s-a)*(s-b)*(s-c));
- return dArea;
- }
- }
- class RightAngledTriangle:Triangle
- {
- public override double ComputeArea(int a, int b, int c)
- {
- double dArea = a*b/2.0;
- return dArea;
- }
- }
- class TriangleTestApp
- {
- public static void Main()
- {
- Triangle tri = new Triangle();
- Console.WriteLine(tri.ComputeArea(2, 5, 6));
- RightAngledTriangle rat = new RightAngledTriangle();
- Console.WriteLine(rat.ComputeArea(3, 4, 5));
- }
- }
基類Triangle定義了方法ComputeArea.它采用三個參數,返回一個double結果,且具有公共訪問性。從Triangle類派生出的是RightAngledTriangle,它改寫了ComputeArea 方法,并實現了自己的面積計算公式。兩個類都被實例化,且在命名為TriangleTestApp的應用類的Main() 方法中得到驗證。
我漏了解釋第14行:
class RightAngledTriangle : Triangle
在類語句中冒號(:)表示RightAngledTriangle從類 Triangle派生。那就是你所必須要做的,以讓C#知道你想把Triangle當作RightAngledTriangle的基類。
當仔細觀察直角三角形的ComputeArea方法時,你會發現第3個參數并沒有用于計算。但是,利用該參數就可以驗證是否是"直角"。
- class RightAngledTriangle:Triangle
- {
- public override double ComputeArea(int a, int b, int c)
- {
- const double dEpsilon = 0.0001;
- double dArea = 0;
- if (Math.Abs((a*a + b*b - c*c)) > dEpsilon)
- {
- dArea = base.ComputeArea(a,b,c);
- }
- else
- {
- dArea = a*b/2.0;
- }
- return dArea;
- }
- }
該檢測簡單地利用了畢達哥拉斯公式,對于直角三角形,檢測結果必須為0.如果結果不為0,類就調用它基類的ComputeArea來實現。
dArea = base.ComputeArea(a,b,c);
例子的要點為:通過顯式地利用基類的資格檢查,你就能輕而易舉地調用基類實現C#改寫方法。當你需要實現其在基類中的功能,而不愿意在C#改寫方法中重復它時,這就非常有幫助。
【編輯推薦】