久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C#學(xué)習(xí)第八天

 靜聽沙漏 2012-02-27

5.2.2 改寫方法

面向?qū)ο笤O(shè)計(jì)的重要原則就是多態(tài)性,。不要理會(huì)高深的理論,,多態(tài)性意味著:當(dāng)基類程序員已設(shè)計(jì)好用于改寫的方法時(shí),在派生類中,,你就可以重定義(改寫)基類的方法?;惓绦騿T可以用virtual 關(guān)鍵字設(shè)計(jì)方法:

virtual void CanBOverridden()

當(dāng)從基類派生時(shí),,所有你要做的就是在新方法中加入override關(guān)鍵字:

override void CanBOverridden()

當(dāng)改寫一個(gè)基類的方法時(shí),你必須明白,,不能改變方法的訪問屬性——在這章的后面,,你會(huì)學(xué)到更多關(guān)于訪問修飾符的知識(shí)。

除了改寫基類方法的事實(shí)外,,還有另一個(gè)甚至更重要的改寫特性,。當(dāng)把派生類強(qiáng)制轉(zhuǎn)換成基類類型并接著調(diào)用虛擬方法時(shí),被調(diào)用的是派生類的方法而不是基類的方法,。

((BaseClass)DerivedClassInstance).CanBOverridden();

為了演示虛擬方法的概念,,清單 5.4 顯示如何創(chuàng)建一個(gè)三角形基類,,它擁有一個(gè)可以被改寫的成員方法(ComputeArea)。

清單 5.4 改寫一個(gè)基類的方法

1: using System;
2:
3: class Triangle
4: {
5: public virtual double ComputeArea(int a, int b, int c)
6: {
7: // Heronian formula
8: double s = (a + b + c) / 2.0;
9: double dArea = Math.Sqrt(s*(s-a)*(s-b)*(s-c));
10: return dArea;
11: }
12: }
13:
14: class RightAngledTriangle:Triangle
15: {
16: public override double ComputeArea(int a, int b, int c)
17: {
18: double dArea = a*b/2.0;
19: return dArea;
20: }
21: }
22:
23: class TriangleTestApp
24: {
25: public static void Main()
26: {
27: Triangle tri = new Triangle();
28: Console.WriteLine(tri.ComputeArea(2, 5, 6));
29:
30: RightAngledTriangle rat = new RightAngledTriangle();
31: Console.WriteLine(rat.ComputeArea(3, 4, 5));
32: }
33: }

基類Triangle定義了方法ComputeArea,。它采用三個(gè)參數(shù),,返回一個(gè)double結(jié)果,且具有公共訪問性,。從Triangle類派生出的是RightAngledTriangle,,它改寫了ComputeArea 方法,并實(shí)現(xiàn)了自己的面積計(jì)算公式,。兩個(gè)類都被實(shí)例化,,且在命名為TriangleTestApp的應(yīng)用類的Main() 方法中得到驗(yàn)證。

我漏了解釋第14行:
class RightAngledTriangle : Triangle
在類語句中冒號(hào)(:)表示RightAngledTriangle從類 Triangle派生,。那就是你所必須要做的,,以讓C#知道你想把 Triangle當(dāng)作RightAngledTriangle的基類。當(dāng)仔細(xì)觀察直角三角形的ComputeArea方法時(shí),,你會(huì)發(fā)現(xiàn)第3個(gè)參數(shù)并沒有用于計(jì)算,。但是,利用該參數(shù)就可以驗(yàn)證是否是“直角”,。如清單5.5所示,。

清單 5.5 調(diào)用基類實(shí)現(xiàn)

1: class RightAngledTriangle:Triangle
2: {
3: public override double ComputeArea(int a, int b, int c)
4: {
5: const double dEpsilon = 0.0001;
6: double dArea = 0;
7: if (Math.Abs((a*a + b*b - c*c)) > dEpsilon)
8: {
9: dArea = base.ComputeArea(a,b,c);
10: }
11: else
12: {
13: dArea = a*b/2.0;
14: }
15:
16: return dArea;
17: }
18: }

該檢測(cè)簡(jiǎn)單地利用了畢達(dá)哥拉斯公式,對(duì)于直角三角形,,檢測(cè)結(jié)果必須為0,。如果結(jié)果不為0,類就調(diào)用它基類的 ComputeArea來實(shí)現(xiàn),。

dArea = base.ComputeArea(a,b,c);

例子的要點(diǎn)為:通過顯式地利用基類的資格檢查,,你就能輕而易舉地調(diào)用基類實(shí)現(xiàn)改寫方法。當(dāng)你需要實(shí)現(xiàn)其在基類中的功能,,而不愿意在改寫方法中重復(fù)它時(shí),,這就非常有幫助。

 

5.2.3 方法屏蔽

重定義方法的一個(gè)不同手段就是要屏蔽基類的方法,。當(dāng)從別人提供的類派生類時(shí),,這個(gè)功能特別有價(jià)值??辞鍐?5.6,,假設(shè)BaseClass由其他人所寫,而你從它派生出 DerivedClass ,。

清單 5.6 Derived Class 實(shí)現(xiàn)一個(gè)沒有包含于 Base Class中的方法

1: using System;
2:
3: class BaseClass
4: {
5: }
6:
7: class DerivedClass:BaseClass
8: {
9: public void TestMethod()
10: {
11: Console.WriteLine("DerivedClass::TestMethod");
12: }
13: }
14:
15: class TestApp
16: {
17: public static void Main()
18: {
19: DerivedClass test = new DerivedClass();
20: test.TestMethod();
21: }
22: }

在這個(gè)例子中,, DerivedClass 通過TestMethod()實(shí)現(xiàn)了一個(gè)額外的功能。但是,,如果基類的開發(fā)者認(rèn)為把TestMethod()放在基類中是個(gè)好主意,,并使用相同的名字實(shí)現(xiàn)它時(shí),,會(huì)出現(xiàn)什么問題呢?(見清單5.7)

清單 5.7 Base Class 實(shí)現(xiàn)和 Derived Class相同的方法

1: class BaseClass
2: {
3: public void TestMethod()
4: {
5: Console.WriteLine("BaseClass::TestMethod");
6: }
7: }
8:
9: class DerivedClass:BaseClass
10: {
11: public void TestMethod()
12: {
13: Console.WriteLine("DerivedClass::TestMethod");
14: }
15: }

在優(yōu)秀的編程語言中,,你現(xiàn)在會(huì)遇到一個(gè)真正的大麻煩,。但是,C#會(huì)給你提出警告:
hiding2.cs(13,14): warning CS0114: 'DerivedClass.TestMethod()' hides inherited member

'BaseClass.TestMethod()'. To make the current method override that implementation, add

the override keyword. Otherwise add the new keyword.
(hiding2.cs(13,14):警告 CS0114:'DerivedClass.TestMethod()' 屏蔽了所繼承的成員

'BaseClass.TestMethod()',。要想使當(dāng)前方法改寫原來的實(shí)現(xiàn),,加上 override關(guān)鍵字。否則加上新的關(guān)鍵字,。具有了修飾符new,,你就可以告訴編譯器,不必重寫派生類或改變使用到派生類的代碼,,你的方法就能屏蔽新加入的基類方法,。清單5.8 顯示如何在例子中運(yùn)用new修飾符。

清單 5.8 屏蔽基類方法

1: class BaseClass
2: {
3: public void TestMethod()
4: {
5: Console.WriteLine("BaseClass::TestMethod");
6: }
7: }
8:
9: class DerivedClass:BaseClass
10: {
11: new public void TestMethod()
12: {
13: Console.WriteLine("DerivedClass::TestMethod");
14: }
15: }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多