您好,登錄后才能下訂單哦!
C#中Abstract 、Virtual和Override三者的區(qū)別是什么?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
1. abstract 修飾符指示所修飾的內(nèi)容缺少實現(xiàn)或未完全實現(xiàn)。abstract修飾符可用于類、方法、屬性、索引器和事件。在類聲明中使用abstract修飾符以指示某個類只能是其他類的基類。標記為抽象或包含在抽象類中的成員必須通過從抽象類派生的類來實現(xiàn)。
(1)抽象類具有以下特性:
1) 抽象類不能實例化。
2) 抽象類可以包含抽象方法和抽象訪問器。
3) 不能用sealed修飾符修飾抽象類,因為這兩個修飾符的含義是相反的。采用sealed修飾符的類無法繼承,而abstract修飾符要求對類進行繼承。
4) 從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實際實現(xiàn)。
5) 在方法或?qū)傩月暶髦惺褂胊bstract修飾符以指示方法或?qū)傩圆话瑢崿F(xiàn)。
(2)抽象方法具有以下特性:
1) 抽象方法是隱式的虛方法。
2) 只允許在抽象類中使用抽象方法聲明。
3) 因為抽象方法聲明不提供實際的實現(xiàn),所以沒有方法體;方法聲明只是以一個分號結(jié)束,并且在簽名后沒有大括號({ })。
(3)在抽象方法聲明中使用static或virtual修飾符是錯誤的。除了在聲明和調(diào)用語法上不同外,抽象屬性的行為與抽象方法一樣。在靜態(tài)屬性上使用abstract修飾符是錯誤的。在派生類中,通過包括使用override修飾符的屬性聲明,可以重寫抽象的繼承屬性。
publicabstractclassparent { protectedintx=100; protectedinty = 200; publicabstractvoidfunction(); publicabstractintX {get; } publicabstractintY {get; } } publicclassnewperson:parent { publicoverridevoidfunction() { x++; y++; } publicoverrideintX { get{returnx+100; } } publicoverrideintY { get{returny+100; } } } staticvoidMain(string[] args) { newpersonp =newnewperson(); Console.WriteLine(p.X); Console.WriteLine(p.Y); p.function(); Console.WriteLine(p.X); Console.WriteLine(p.Y); Console.ReadKey(); }
2.virtual關(guān)鍵字用于修飾方法、屬性、索引器或事件聲明,并使它們可以在派生類中被重寫。虛擬成員的實現(xiàn)可由派生類中的重寫成員更改。調(diào)用虛方法時,將為重寫成員檢查該對象的運行時類型。將調(diào)用大部分派生類中的該重寫成員,如果沒有派生類重寫該成員,則它可能是原始成員。默認情況下,方法是非虛擬的。不能重寫非虛方法。virtual修飾符不能與static、abstract, private或override修飾符一起使用。和抽象方法的相同點是都用了override關(guān)鍵字進行重寫方法,不同點是抽象方法必須存在于抽象類中,而子類必須重寫,除非子類也是抽象的。
publicclassDimensions { publicconstdoublePI =Math.PI; protecteddoublex; protecteddoubley; publicDimensions() { } publicDimensions(doublex,doubley) { this.x = x; this.y = y; } publicvirtualdoubleArea() { returnx * y; } } publicclassCircle:Dimensions { publicCircle(doubler) :base(r,0) { } publicoverridedoubleArea() { Console.WriteLine(base.Area()); returnPI * x * x; } } publicclassSphere:Dimensions { publicSphere(doubler) :base(r,0) { } publicoverridedoubleArea() { return4 * PI * x * x; } } publicclassCylinder:Dimensions { publicCylinder(doubler,doubleh) :base(r, h) { } publicoverridedoubleArea() { return2 * PI * x * x + 2 * PI * x * y; } } staticvoidMain(string[] args) { DimensionsP =newCircle(5.0); Spheresphere =newSphere(10); Cylindercylinder =newCylinder(10, 10); Console.WriteLine(P.Area()); Console.WriteLine(sphere.Area()); Console.WriteLine(cylinder.Area()); Console.ReadKey(); }
3.override方法提供從基類繼承的成員的新實現(xiàn)。由override聲明重寫的方法稱為重寫基方法。重寫的基方法必須與override方法具有相同的簽名。不能重寫非虛方法或靜態(tài)方法。重寫的基方法必須是virtual、abstract或override的。override聲明不能更改virtual方法的可訪問性。override方法和virtual方法必須具有相同的訪問級別修飾符。重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,并且被重寫的屬性必須是virtual、abstract或override的。
4.base和this的區(qū)別
1)base作用:用于從派生類中訪問基類的成員,調(diào)用基類上已被其他方法重寫的方法。指定創(chuàng)建派生類實例時應調(diào)用的基類構(gòu)造函數(shù)。
注:從靜態(tài)方法中使用base關(guān)鍵字是錯誤的。
2)區(qū)別:
base是子類中引用父類,用于在派生類中訪問重寫的基類成員。
this是當前類,引用自己,用于訪問本類的成員,當然也包括繼承而來公有和保護成員。
3)注意:
a).在靜態(tài)成員中使用base和this都是不允許的。原因是,base和this訪問的都是類的實例,也就是對象,而靜態(tài)成員只能由類來訪問,不能由對象來訪問。
b).base是為了實現(xiàn)多態(tài)而設計的。
c).使用this或base關(guān)鍵字只能指定一個構(gòu)造函數(shù),也就是說不可同時將this和base作用在一個構(gòu)造函數(shù)上。
d).除了base,訪問基類成員的另外一種方式是:顯示的類型轉(zhuǎn)換來實現(xiàn)。只是該方法不能為靜態(tài)方法。
看完上述內(nèi)容,你們掌握C#中Abstract 、Virtual和Override三者的區(qū)別是什么的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。