【C#】C#抽象类及其方法
一、解釋1
在C#中使用關鍵字 abstract 來定義抽象類和抽象方法。
不能初始化的類被叫做抽象類,它們只提供部分實現,但是另一個類可以繼承它并且能創建它們
的實例。
"一個包含一個或多個純虛函數的類叫抽象類,抽象類不能被實例化,進一步
一個抽象類只能通過接口和作為其它類的基類使用."- C++ Programming Language by Stroustrup Chapter13.2
抽象類能夠被用于類,方法,屬性,索引器和事件,使用abstract 在一個類聲明中表示該類傾向要作為其它類的基類
成員被標示成abstract,或被包含進一個抽象類,必須被其派生類實現。
?
abstract class ShapesClass
??? {
??????? abstract public int Area();
??? }
??? class Square : ShapesClass
??? {
??????? int x, y;
??????? // Not providing an Area method results
??????? // in a compile-time error.
??????? public override int Area()
??????? {
??????????? return x * y;
??????? }
??? }
例如,一個包含非抽象方法的抽象類:
?
??? abstract class MyAbs
??? {
??????? public void NonAbMethod()
??????? {
??????????? Console.WriteLine("Non-Abstract Method");
??????? }
??? }
??? class MyClass : MyAbs
??? {
??? }
??? class MyClient
??? {
??????? public static void Main()
??????? {
??????????? //MyAbs mb = new MyAbs();//not possible to create an instance
??????????? MyClass mc = new MyClass();
??????????? mc.NonAbMethod(); // Displays 'Non-Abstract Method'
??????? }
??? }
一個抽象類可以包含抽象和非抽象方法,當一個類繼承于抽象類,那么這個派生類必須實現所有的
的基類抽象方法。
一個抽象方法是一個沒有方法體的方法。
abstract class MyAbs
??? {
??????? public void NonAbMethod()
??????? {
??????????? Console.WriteLine("Non-Abstract Method");
??????? }
??????? public abstract void AbMethod(); // An abstract method
??? }
??? class MyClass : MyAbs//must implement base class abstract methods
??? {
??????? public override void AbMethod()
??????? {
??????????? Console.WriteLine("Abstarct method");
??????? }
??? }
??? class MyClient
??? {
??????? public static void Main()
??????? {
??????????? MyClass mc = new MyClass();
??????????? mc.NonAbMethod();
??????????? mc.AbMethod();
??????? }
??? }
但是通過聲明派生類也為抽象,我們可以避免所有或特定的虛方法的實現,
這就是抽象類的部分實現。
abstract class MyAbs
??? {
??????? public abstract void AbMethod1();
??????? public abstract void AbMethod2();
??? }
??? //not necessary to implement all abstract methods
??? //partial implementation is possible
??? abstract class MyClass1 : MyAbs
??? {
??????? public override void AbMethod1()
??????? {
??????????? Console.WriteLine("Abstarct method #1");
??????? }
??? }
??? class MyClass : MyClass1
??? {
??????? public override void AbMethod2()
??????? {
??????????? Console.WriteLine("Abstarct method #2");
??????? }
??? }
??? class MyClient
??? {
??????? public static void Main()
??????? {
??????????? MyClass mc = new MyClass();
??????????? mc.AbMethod1();
??????????? mc.AbMethod2();
??????? }
??? }
在C#中,一個抽象類能夠繼承另一個非抽象類,另外,繼承了基類的方法,添加新的
抽象和非抽象方法是可行的。
class MyClass1 // Non-Abstract class
??? {
??????? public void Method1()
??????? {
??????????? Console.WriteLine("Method of a non-abstract class");
??????? }
??? }
??? abstract class MyAbs : MyClass1 // Inherits from an non-abstract class
??? {
??????? public abstract void AbMethod1();
??? }
??? class MyClass : MyAbs//must implement base class abstract methods
??? {
??????? public override void AbMethod1()
??????? {
??????????? Console.WriteLine("Abstarct method #1 of MyClass");
??????? }
??? }
??? class MyClient
??? {
??????? public static void Main()
??????? {
??????????? MyClass mc = new MyClass();
??????????? mc.Method1();
??????????? mc.AbMethod1();
??????? }
??? }
一個抽象類也能從一個接口來實現,這種情況,我們必須為所有的方法提供方法體,這些方法是來自接口
??? interface IInterface
??? {
??????? void Method1();
??? }
??? abstract class MyAbs : IInterface
??? {
??????? public void Method1()
??????? {
??????????? Console.WriteLine("Method implemented from the IInterface");
??????? }
??? }
??? class MyClass : MyAbs//must implement base class abstract method
??? {
??? }
??? class MyClient
??? {
??????? public static void Main()
??????? {
??????? MyClass mc = new MyClass();
??????? mc.Method1();
??????? }
??? }
我們不能把關鍵字abstract 和 sealed 一起用在C#中,因為一個密封類不能夠被抽象。
abstract class MyAbs
??? {
??????? public abstract void AbMethod1();
??????? public abstract void AbMethod2();
??? }
??? class MyClass1 : MyAbs
??? {
??????? public override void AbMethod1()
??????? {
??????????? Console.WriteLine("Abstarct method #1 of MyClass1");
??????? }
??????? public override void AbMethod2()
??????? {
??????????? Console.WriteLine("Abstarct method #2 of MyClass1");
??????? }
??? }
??? class MyClient
??? {
??????? public static void Main()
??????? {
??????????? MyAbs ma1 = new MyClass1();// Polymorphism
??????????? ma1.AbMethod1();
??????????? ma1.AbMethod2();
??????? }
??? }
抽象方法有以下特征:
1.一個抽象方法可以看作是一個虛函數。
2.抽象方法的聲明只能在抽象類中。
3.因為抽象方法聲明只提供一個無實現的方式,沒有方法體
4.方法體的實現被覆寫方法提供,覆寫方法是一個非抽象類的成員。
5.抽象屬性的行為和抽象方法相像,除了不同的聲明形式。
6.在一個靜態屬性中使用abstract 是一個錯誤。
??????? *一個抽象屬性能夠通過派生類使用 override 實現.
對于抽象類:
一個抽象類必須為所有的接口成員提供實現
一個用于實現接口的抽象類可能把接口方法安排到抽象方法上。例如
interface I
{
??? void M();
}
abstract class C: I
{
??? public abstract void M();
}
抽象類具有以下特征:
1.抽象類不能被實例化。
2.抽象類可以包含抽象方法和訪問器
3.不能把抽象類用密封(sealed)來修飾,那就意味著類不能被繼承,這違反抽象類被繼承的原則。
4.一個派生于一個抽象類的非抽象類必須包括所有的繼承來的抽象方法和訪問器的實現
5.在方法和屬性中使用abstract 關鍵字意味著包含它們的實現。
二、解釋2
//抽象方法:只包含方法定義,但沒有具體實現的方法,需要其子類或者子類的子類來具體實現。 //靜態方法不能標記為 override、virtual 或 abstract,即靜態方法都必須是具體的 /抽象類:含有一個或多個抽象方法的類稱為抽象類,在聲明時,類名前須添加"abstract"關鍵字 //抽象類中可以包含非抽象方法 //抽象類不能夠被實例化,這是因為它包含了沒有具體實現的方法,即可實例化的類一定不是抽象類,不包含未具體實現的抽象方法。 //子類繼承抽象父類后,可以使用override關鍵字覆蓋父類中的抽象方法,并做具體的實現。也可以不實現抽象方法,留給后代實現,這時子類仍舊是一個抽象類,必須聲明為abstract //繼承的抽象方法不可以被隱藏 //隱藏:在子類中創建與父類中的方法具有相同簽名(相同的方法名,相同的參數列表--參數類型和次序)的方法(可以帶有"virtual"或"override"關鍵字)即可實現,但建議使用"new"關鍵字,以明確地隱藏。 //只能使用"override"關鍵字來覆蓋(override)父類中標記為"virtual"、"abstract"或"override"的方法,而子類中標記為override的方法,也必須是父類中標記為"virtual"、"abstract"或"override"的方法。 //覆蓋(override):必須使用override關鍵字,可以被覆蓋的方法包括標記為abstract,virtual,和override的方法; //隱藏:使用new關鍵字,也可不使用關鍵字,可以被隱藏的方法包括一般方法,和標記為virtual"或"override"的方法; //重載(overload):不需要任何特殊的關鍵字 //靜態方法可以被隱藏或重載 三、解釋3 1、聲明一個抽象方法使用abstract關鍵字。2、一個類中可以包含一個或多個抽象方法。
3、抽象類中可以存在非抽象的方法。
4、抽象類不能被直接被實例化。
5、實現抽象類用“:”(冒號),實現抽象方法用override關鍵字。
6、抽象類可以被抽象類所繼承,結果仍是抽象類。
7、抽象方法被實現后,不能更改修飾符。
using System;
namespace Abstract_for
{
/// <summary>
/// 抽象類 Abc
/// </summary>
abstract class Abc
{
public abstract void Afunc();//聲明了抽象方法,但不實現
public void Bfunc()
{
Console.WriteLine("非抽象方法!");
}
}
/// <summary>
/// 抽象類Abc的派生類Derv
/// </summary>
class Derv:Abc
{//此類必須實現基類的抽象方法,否則必須聲明為abstract的
public override void Afunc()
{//使用override關鍵字可以在派生類中實現抽象方法!通過override聲明重寫的方法成為重寫基類方法
Console.WriteLine("實現抽象方法");
}
}
public class Test{
public static void Main(string[] args)
{
Derv d = new Derv();
d.Afunc();
d.Bfunc();
}
}
}
?
-----------------------------------------
抽象類 用abstract 形容的 抽象類不能被實例化,只能被繼承 舉例說明 //抽象類 abstract class 畫圖類 { public void 畫圖 {} } //繼承類 class 畫三角類 :畫圖類 { public void 畫圖 { //實現畫三角的方法 } //繼承類 class 畫圓類 :畫圖類 { public void 畫圖 { //實現畫圓的方法 } } ok ! 畫圖類 paint1 = new 畫三角類() ; paint1.畫圖();//畫三角 畫圖類 paint2 = new 畫圓類() ; paint2.畫圖();//畫圓
?
轉自:http://www.cnblogs.com/cuishao1985/archive/2009/12/30/1636190.html
轉載于:https://www.cnblogs.com/xixi-/p/5299619.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【C#】C#抽象类及其方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VRRP+SmartLink双上行配置案
- 下一篇: DelphiXE7中创建WebServi