深入解析C#中的abstract抽象類
抽象類和類成員
通過在類定義前面放置關鍵字 abstract,可以將類聲明為抽象類。例如:
public abstract class A
{
// Class members here.
}
抽象類不能實例化。抽象類的用途是提供一個可供多個派生類共享的通用基類定義。例如,類庫可以定義一個抽象類,將其用作多個類庫函數(shù)的參數(shù),并要求使用該庫的程序員通過創(chuàng)建派生類來提供自己的類實現(xiàn)。
抽象類也可以定義抽象方法。方法是將關鍵字 abstract 添加到方法的返回類型的前面。例如:
public abstract class A
{
public abstract void DoWork(int i);
}
抽象方法沒有實現(xiàn),所以方法定義后面是分號,而不是常規(guī)的方法塊。抽象類的派生類必須實現(xiàn)所有抽象方法。當抽象類從基類繼承虛方法時,抽象類可以使用抽象方法重寫該虛方法。例如:
// compile with: /target:library
public class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}
public abstract class E : D
{
public abstract override void DoWork(int i);
}
public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}
如果將 virtual 方法聲明為 abstract,則該方法對于從抽象類繼承的所有類而言仍然是虛方法。繼承一個抽象方法的類不能訪問該方法的原始實現(xiàn)。在上一個示例中,類 F 中的 DoWork 不能調用類 D 中的 DoWork。通過這種方式,抽象類可以強制派生類為虛方法提供新的方法實現(xiàn)。
定義抽象屬性
下面的示例演示如何定義抽象屬性。抽象屬性聲明不提供屬性訪問器的實現(xiàn),它只聲明該類支持屬性,而將訪問器實現(xiàn)留給派生類。下面的示例演示如何實現(xiàn)從基類繼承的抽象屬性。
此示例由三個文件組成,其中每個文件都單獨編譯,產(chǎn)生的程序集由下一次編譯引用:
- abstractshape.cs:包含抽象 Area 屬性的 Shape 類。
- shapes.cs:Shape 類的子類。
- shapetest.cs:測試程序,它顯示某些 Shape 派生對象的面積。
若要編譯該示例,請使用以下命令:
csc abstractshape.cs shapes.cs shapetest.cs
這樣將生成可執(zhí)行文件 shapetest.exe。
該文件聲明的 Shape 類包含 double 類型的 Area 屬性。
// compile with: csc /target:library abstractshape.cs
public abstract class Shape
{
private string name;
public Shape(string s)
{
// calling the set accessor of the Id property.
Id = s;
}
public string Id
{
get
{
return name;
}
set
{
name = value;
}
}
// Area is a read-only property - only a get accessor is needed:
public abstract double Area
{
get;
}
public override string ToString()
{
return Id + " Area = " + string.Format("{0:F2}", Area);
}
}
屬性的修飾符就放置在屬性聲明中。例如:
public abstract double Area
聲明抽象屬性時(如本示例中的 Area),指明哪些屬性訪問器可用即可,不要實現(xiàn)它們。在此示例中,只有一個 get 訪問器可用,因此該屬性是只讀的。
下面的代碼演示 Shape 的三個子類,并演示它們如何重寫 Area 屬性來提供自己的實現(xiàn)。
// compile with: csc /target:library /reference:abstractshape.dll shapes.cs
public class Square : Shape
{
private int side;
public Square(int side, string id)
: base(id)
{
this.side = side;
}
public override double Area
{
get
{
// Given the side, return the area of a square:
return side * side;
}
}
}
public class Circle : Shape
{
private int radius;
public Circle(int radius, string id)
: base(id)
{
this.radius = radius;
}
public override double Area
{
get
{
// Given the radius, return the area of a circle:
return radius * radius * System.Math.PI;
}
}
}
public class Rectangle : Shape
{
private int width;
private int height;
public Rectangle(int width, int height, string id)
: base(id)
{
this.width = width;
this.height = height;
}
public override double Area
{
get
{
// Given the width and height, return the area of a rectangle:
return width * height;
}
}
}
下面的代碼演示一個測試程序,它創(chuàng)建若干 Shape 派生對象,并輸出它們的面積。
// compile with: csc /reference:abstractshape.dll;shapes.dll shapetest.cs
class TestClass
{
static void Main()
{
Shape[] shapes =
{
new Square(5, "Square #1"),
new Circle(3, "Circle #1"),
new Rectangle( 4, 5, "Rectangle #1")
};
System.Console.WriteLine("Shapes Collection");
foreach (Shape s in shapes)
{
System.Console.WriteLine(s);
}
}
}
輸出:
Shapes Collection Square #1 Area = 25.00 Circle #1 Area = 28.27 Rectangle #1 Area = 20.00
欄 目:C#教程
下一篇:C#編程中枚舉類型的使用教程
本文標題:深入解析C#中的abstract抽象類
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6734.html
您可能感興趣的文章
- 01-10深入淺出23種設計模式
- 01-10C#中查找Dictionary中的重復值的方法
- 01-10C#將圖片存放到SQL SERVER數(shù)據(jù)庫中的方法
- 01-10關于nancy中的身份驗證
- 01-10C#中的事務用法實例分析
- 01-10C#實現(xiàn)讀取DataSet數(shù)據(jù)并顯示在ListView控件中的方法
- 01-10C#中的正則表達式介紹
- 01-10C#開發(fā)中的垃圾回收機制簡析
- 01-10C#語言中的修飾符匯總
- 01-10C#中的 == 和equals()區(qū)別淺析


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關于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)控當前操作系統(tǒng)已
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法


