C#之Abstract、Vitrual、Override
Abstract
abstract修飾符可以和類、方法、屬性、索引器及事件一起使用。在類宣告中使用 abstract修飾符以指示某個類只能是其他類的基類。標記為抽象或包含在抽象類中的成員必須通過從抽象類派生的類來實現。
1.抽象類:
用它修飾的類稱為抽象類,抽象類不能例項化。
抽象類中,包括抽象方法,還可以有抽象屬性。(抽象屬性也必須改寫。)
非抽象類從抽象類中派生,必須通過改寫來實現所有繼承而來的抽象方法。如果一個類,從抽象類中派生,但是沒有對抽象類中的方法進行實現的話,那麼這個類必須是抽象類。即派生類也是抽象類。
2.抽象方法:
抽象方法只能在抽象類中宣告。不能再使用static和virtual修飾
抽象方法只給出方法原形。不能在抽象方法中包含任何可執行程式碼,沒有方法體,用分號結束。
抽象方法在派生類中不能使用base關鍵字訪問。
class Program { static void Main() { DeriverC2 tt =new DeriverC2(); //例項化DeriverC類,抽象類不能例項化 tt.function1(); } } abstract class BaseC //抽象類; { public abstract void function1(); //抽象類中的抽象方法; } abstract class DeriveC1 : BaseC //抽象類繼承抽象類; { public void function2() { } //抽象類中的非抽象方法; } class DeriverC2 : BaseC //非抽象類繼承抽象類; { public override void function1() //必須改寫; { Console.WriteLine ("類DeriverC2具體實現類BaseC的抽象方法function1()"); } }
Virtual
virtual關鍵字用於修飾方法、屬性、索引器或事件宣告,並且允許在派生類中重寫這些物件。
虛擬成員的實現可由派生類中的重寫成員更改。例如,此方法可被任何繼承它的類重寫。
預設情況下,方法是非虛擬的。不能重寫非虛方法
Override
override關鍵字要擴充套件或修改繼承的方法、屬性、索引器或事件的抽象實現或虛實現,必須使用override 修飾符。
override方法提供從基類繼承的成員的新實現。
通過override 宣告重寫的方法稱為重寫基方法。重寫的基方法必須與 override 方法具有相同的簽名。
不能重寫非虛方法或靜態方法。重寫的基方法必須是virtual、abstract 或 override 的。
override宣告不能更改 virtual 方法的可訪問性。override 方法和 virtual 方法必須具有相同的訪問級別修飾符。不能使用修飾符new、static、virtual 或 abstract 來修改 override 方法。
重寫屬性宣告必須指定與繼承屬性完全相同的訪問修飾符、型別和名稱,並且被重寫的屬性必須是virtual、abstract 或 override 的。
總結:
Abstract關鍵字能夠修飾類,抽象類不能例項化,抽象類可以繼承抽象類。
Virtual關鍵字修飾的虛方法和Abstract修飾的抽象方法的相同點是都用了override關鍵字進行重寫方法,不同點是抽象方法必須存在於抽象類中,而子類必須重寫,除非子類也是抽象的。
Override關鍵字,重寫的基方法必須和override方法名字相同,屬性也可以重寫,重寫屬性和繼承屬性有相同的訪問修飾符,型別和名稱。
相關文章
- C# [method Modifiers] abstract virtual override newC#IDE
- c# abstract抽象類_非抽象類_virtual_虛方法_override重寫C#抽象IDE
- virtual abstract override new 幾點學習IDE
- c# abstractC#
- C# interface abstract classC#
- C#基礎——abstractC#
- makefile之overrideIDE
- c# sealed override密封類_密封方法C#IDE
- 【轉】C#中virtual和abstract的區別C#
- c# abstract抽象類及抽象方法_繼承C#抽象繼承
- C#關鍵字之過載overload、重寫override、覆寫overwrite(new)詳解C#IDE
- Java之所有物件的公用方法>9.Always override hashCode when you override equalsJava物件IDE
- PHP abstract與interface之間的區別PHP
- 設計模式討論之abstract factory篇設計模式
- java abstractJava
- 走進C# abstract,瞭解抽象類與介面的異同C#抽象
- Override setterIDE
- 設計模式討論之abstract factory篇 (轉)設計模式
- 使用C# (.NET Core) 實現抽象工廠設計模式 (Abstract Pattern)C#抽象設計模式
- @Override標籤IDE
- Aura QuickAction OverrideUIIDE
- 一句話說明白C#中的new與override的區別C#IDE
- Java關鍵字之abstract(抽象類的概念和使用)Java抽象
- JAVA設計模式之 抽象工廠模式【Abstract Factory Pattern】Java設計模式抽象
- TypeScript abstract 抽象類TypeScript抽象
- abstract類和介面
- java基礎:abstractJava
- Scala的Abstract Types
- Abstract Factory + Template = BuilderUI
- c# abstract抽象類與繼承類子類的建構函式_baseC#抽象繼承函式
- 方法重寫(Override)IDE
- 使用 Override 和 New 關鍵字進行版本控制(C# 程式設計指南)IDEC#程式設計
- C++11新特性之final override識別符號C++IDE符號
- Java之所有物件的公用方法>10.Always override toStringJava物件IDE
- 介面和抽象類 (abstract)抽象
- abstract 的 interface ,如何理解?
- Java中@Override的作用JavaIDE
- JAVA中 @Override 的作用JavaIDE