我想知道是什麼讓一個類被稱爲absract類。我相信,abract關鍵字定義了一個類的類,但是如果一個關鍵字取出,那麼我們可以創建該類的實例。抽象類的特徵
換句話說,抽象類有什麼特點。
在此先感謝。
-Harsha
我想知道是什麼讓一個類被稱爲absract類。我相信,abract關鍵字定義了一個類的類,但是如果一個關鍵字取出,那麼我們可以創建該類的實例。抽象類的特徵
換句話說,抽象類有什麼特點。
在此先感謝。
-Harsha
與純粹的實現類不同,抽象類不構成真實世界中的具體對象。抽象名稱建議他們持有/定義需要在所有相關對象中獨立重用/定義的相關對象的共同行爲。
舉一個鳥的例子。如果你正在編寫一個與鳥類有關的程序,那麼你首先會得到一個抽象的基類,如Bird,每個鳥類都來自抽象基類Bird。請注意,抽象類BIRD並不代表一個具體的真實世界對象,而是一種相關的對象,即鳥類!
讓我們從類圖開始,然後是一些代碼。
alt text http://ruchitsurati.net/files/birds.png
public abstract class Bird
{
protected string Name = string.Empty;
public Bird(string name)
{
this.Name = name;
}
public virtual void Fly()
{
Console.WriteLine(string.Format("{0} is flying.", this.Name));
}
public virtual void Run()
{
Console.WriteLine(string.Format("{0} cannot run.", this.Name));
}
}
public class Parrot : Bird
{
public Parrot() : base("parrot") { }
}
public class Sparrow : Bird
{
public Sparrow() : base("sparrow") { }
}
public class Penguin : Bird
{
public Penguin() : base("penguin") { }
public override void Fly()
{
Console.WriteLine(string.Format("{0} cannot fly. Some birds do not fly.", this.Name));
}
public override void Run()
{
Console.WriteLine(string.Format("{0} is running. Some birds do run.", this.Name));
}
}
class Program
{
static void Main(string[] args)
{
Parrot p = new Parrot();
Sparrow s = new Sparrow();
Penguin pe = new Penguin();
List<Bird> birds = new List<Bird>();
birds.Add(p);
birds.Add(s);
birds.Add(pe);
foreach (Bird bird in birds)
{
bird.Fly();
bird.Run();
}
Console.ReadLine();
}
}
一個抽象類具有一個奇異特性:可以創建沒有的類的實例。抽象類被設計爲用作其他抽象類和非抽象類的基類。
對於類abstract
有任何意義,它必須有需要實現的抽象成員,否則它是無關的(除非你打算防止實例化),你應該刪除它。
它可能有一個抽象的財產的繼承人需要聲明,這樣
public abstract int ID { get; }
或方法,它必須實現:
public abstract void DoSomething();
你會使用它,如果類本身是永遠不會被實例化,但您需要的不僅僅是一個接口,例如基本屬性,並且您希望稍後使用它:
((MyAbstractClass)obj).DoSomething(); //All inheritors implemented this
一個抽象類有兩個相關的用途:
抽象類的主要目的是服務於作爲後代類的基類,提供了可能的一些通用功能,但至少提供了後代必須實現的一套通用方法。例如,您可以使用抽象方法Eat創建一個抽象類Fruit。因爲你實際上不能吃一個「水果」,所以你需要吃一種特定類型的水果,課程是抽象的,你永遠不會看到一個在野外被標記爲「水果」的對象。
取而代之,您將看到蘋果,香蕉,橙子等類型的對象,它們是水果的後代,並且具有Eat的實際實現。
除了頂部的兩件事之外,抽象類沒有什麼特別之處。
我不認爲任何人還沒有說這個,但我相信一個抽象類的顯着特徵是:
編碼器知道如何之類的X%是實現,以及如何(100 -X)%應該是實現的,但是不能是。
這是什麼區別抽象類。接口描述了應該如何實現一個類,但是不要給實現者提供任何代碼或支持。具有虛擬方法的基類提供了繼承者可能覆蓋的默認實現。
它只是抽象類可以提供部分實現,但不能提供完整的實現。
-1使用動物的例子。 – 2010-05-17 16:48:26
是否會傷害任何情緒?你能否證明downvote的理由? – 2010-05-17 17:10:48
非常感謝您的時間和回覆。還有其他可以記住的獨特角色嗎? 再次感謝 – Harsha 2010-05-18 10:42:48