C#中abstract的用法詳解
abstract可以用來修飾類,方法,屬性,索引器和時間,這里不包括字段. 使用abstrac修飾的類,該類只能作為其他類的基類,不能實例化,而且abstract修飾的成員在派生類中必須全部實現(xiàn),不允許部分實現(xiàn),否則編譯異常. 如:
using System; namespace ConsoleApplication8 { class Program { static void Main(string[] args) { BClass b = new BClass(); b.m1(); } } abstract class AClass { public abstract void m1(); public abstract void m2(); } class BClass : AClass { public override void m1() { throw new NotImplementedException(); } //public override void m2() //{ // throw new NotImplementedException(); //} } }
Abstract classes have the following features:
抽象類擁有如下特征:
1,抽象類不能被實例化, 但可以有實例構(gòu)造函數(shù), 類是否可以實例化取決于是否擁有實例化的權(quán)限 (對于抽象類的權(quán)限是abstract, 禁止實例化),
即使不提供構(gòu)造函數(shù), 編譯器也會提供默認(rèn)構(gòu)造函數(shù);
2,抽象類可以包含抽象方法和訪問器;
3,抽象類不能使用sealed修飾, sealed意為不能被繼承;
4,所有繼承自抽象類的非抽象類必須實現(xiàn)所有的抽象成員,包括方法,屬性,索引器,事件;
abstract修飾的方法有如下特征:
1,抽象方法即是虛擬方法(隱含);
2,抽象方法只能在抽象類中聲明;
3,因為抽象方法只是聲明, 不提供實現(xiàn), 所以方法只以分號結(jié)束,沒有方法體,即沒有花括號部分;如
public abstract void MyMethod();
4,override修飾的覆蓋方法提供實現(xiàn),且只能作為非抽象類的成員;
5,在抽象方法的聲明上不能使用virtual或者是static修飾.即不能是靜態(tài)的,又因為abstract已經(jīng)是虛擬的,無需再用virtual強(qiáng)調(diào).
抽象屬性盡管在行為上與抽象方法相似,但仍有有如下不同:
1,不能在靜態(tài)屬性上應(yīng)用abstract修飾符;
2,抽象屬性在非抽象的派生類中覆蓋重寫,使用override修飾符;
抽象類與接口:
1,抽象類必須提供所有接口成員的實現(xiàn);
2,繼承接口的抽象類可以將接口的成員映射位抽象方法.
如:
interface I { void M(); } abstract class C: I { public abstract void M(); } 抽象類實例: // abstract_keyword.cs // 抽象類 using System; abstract class BaseClass // 抽象類 { protected int _x = 100; //抽象類可以定義字段,但不可以是抽象字段,也沒有這一說法. protected int _y = 150; public BaseClass(int i) //可以定義實例構(gòu)造函數(shù),僅供派生的非抽象類調(diào)用; 這里顯式提供構(gòu)造函數(shù),編譯器將不再提供默認(rèn)構(gòu)造函數(shù). { fielda = i; } public BaseClass() { } private int fielda; public static int fieldsa = 0; public abstract void AbstractMethod(); // 抽象方法 public abstract int X { get; } //抽象屬性 public abstract int Y { get; } public abstract string IdxString { get; set; } //抽象屬性 public abstract char this[int i] { get; } //抽象索引器 } class DerivedClass : BaseClass { private string idxstring; private int fieldb; //如果基類中沒有定義無參構(gòu)造函數(shù),但存在有參數(shù)的構(gòu)造函數(shù), //那么這里派生類得構(gòu)造函數(shù)必須調(diào)用基類的有參數(shù)構(gòu)造函數(shù),否則編譯出錯 public DerivedClass(int p) : base(p) //這里的:base(p)可省略,因為基類定義了默認(rèn)的無參構(gòu)造函數(shù) { fieldb = p; } public override string IdxString //覆蓋重新屬性 { get { return idxstring; } set { idxstring = value; } } public override char this[int i] //覆蓋重寫索引器 { get { return IdxString[i]; } } public override void AbstractMethod() { _x++; _y++; } public override int X // 覆蓋重寫屬性 { get { return _x + 10; } } public override int Y // 覆蓋重寫屬性 { get { return _y + 10; } } static void Main() { DerivedClass o = new DerivedClass(1); o.AbstractMethod(); Console.WriteLine("x = {0}, y = {1}", o.X, o.Y); } }
以上所述是小編給大家介紹的C#中abstract的用法詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
欄 目:C#教程
下一篇:C#中把任意類型的泛型集合轉(zhuǎn)換成SQLXML數(shù)據(jù)格式的實例
本文標(biāo)題:C#中abstract的用法詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6087.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#停止線程的方法
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新聞效果的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實現(xiàn)多線程下載文件的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10C#中split用法實例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery