C#允許派生類中的方法與基類中方法具有相同的簽名:基類中使用關鍵字virtual定義虛方法;然后派生類中使用關鍵字override來重寫方法,或使用關鍵字new來覆蓋方法(隱藏方法)。
重寫方法用相同的簽名重寫所繼承的虛方法。虛方法聲明用于引入新方法,而重寫方法或隱藏方法聲明則是用于使現有的繼承虛方法專用化(通過提供該方法的新實現)
注意:如果簽名相同的方法在基類和派生類都進行了聲明,但該方法沒有聲明為virtual和override/new,則派生類方法就會隱藏基類方法,但系統編譯時會產生警告信息。因為隱藏方法會存在為給定類的實例調用錯誤方法的危險,故應該顯示地定義隱藏方法。
調用虛方法時,將首先檢查該對象的運行時類型,并調用派生類中的該重寫成員。如果沒有派生類重寫該成員,則調用其原始數據。
默認情況下,C#方法是非虛擬的。不能重寫非虛方法,重寫非虛方法將導致編譯錯誤。
除了類方法外,還可以使用virtual關鍵字其他類成員以定義虛成員,包括屬性【無參屬性】、索引器【含參屬性】或事件聲明。虛擬成員的實現可在派生類使用關鍵字override來重寫;或使用關鍵字new來覆蓋。
注意:virtual 修飾符不能與static、abstract、PRivate或override修飾符一起使用。
例:
虛方法,重寫方法和隱藏方法示例:Dimensions類包含x,y兩個坐標和Area()虛方法。Dimensions類的派生類(Circle、Cylinder和Sphere)均重寫了基類的虛方法Area()以實現不同圖形表面積的計算。調用虛方法Area()時,將根據此方法關聯的運行時對象調用適當的Area()實現,為每個圖形計算并顯示適當的面積。
1: namespace Consoleapplication2
2: {3:
4:
5:
6: public class Dimensions
7: {8:
9: public const double PI = Math.PI;
10: protected double x, y;
11: public Dimensions()
12: {13:
14: }
15:
16: public Dimensions(double x, double y)
17: {18: this.x = x;
19: this.y = y;
20: }
21:
22: public virtual double Area()
23: {24: return x * y;
25: }
26:
27: }
28:
29: public class Circle : Dimensions //派生類:圓
30: {31: public Circle(double r)
32: : base(r, 0)
33: {34:
35: }
36:
37: public override double Area()
38: {39: //園的面積
40: return PI * x * x;
41: }
42: }
43: public class Sphere : Dimensions //派生類:球體
44: {45: public Sphere(double r)
46: : base(r, 0)
47: {48:
49: }
50:
51: public override double Area()
52: {53: //球體的表面積
54: return 4 * PI * x * x;
55: }
56: }
57: public class Cylinder : Dimensions //派生類:圓柱體
58: {59: public Cylinder(double r)
60: : base(r, 0)
61: {62:
63: }
64:
65: public override double Area()
66: {67: //圓柱體的表面積
68: return 2 * PI * x * x + 2 * PI * x * y;
69: }
70: }
71:
72: public class Program
73: {74:
75:
76: static void Main(string[] args)
77: {78: double r = 3.0, h = 5.0;
79: Dimensions c = new Circle(r); //圓
80:
81: Dimensions s = new Sphere(r); //球體
82:
83:
84: Dimensions l = new Cylinder(r); //圓柱體
85:
86: //顯示各種不同形狀的表面積
87:
88: Console.WriteLine("圓的面積={0:f2}",c.Area()); 89: Console.WriteLine("球體的面積={0:f2}", s.Area()); 90: Console.WriteLine("圓柱體的面積={0:f2}", l.Area());91: Console.ReadKey();
92: }
93: }
94: }
新聞熱點
疑難解答