2010-05-17 81 views
2

我想知道是什麼讓一個類被稱爲absract類。我相信,abract關鍵字定義了一個類的類,但是如果一個關鍵字取出,那麼我們可以創建該類的實例。抽象類的特徵

換句話說,抽象類有什麼特點。

在此先感謝。

-Harsha

回答

8

與純粹的實現類不同,抽象類不構成真實世界中的具體對象。抽象名稱建議他們持有/定義需要在所有相關對象中獨立重用/定義的相關對象的共同行爲。

舉一個鳥的例子。如果你正在編寫一個與鳥類有關的程序,那麼你首先會得到一個抽象的基類,如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(); 
    } 
} 
+0

-1使用動物的例子。 – 2010-05-17 16:48:26

+0

是否會傷害任何情緒?你能否證明downvote的理由? – 2010-05-17 17:10:48

+0

非常感謝您的時間和回覆。還有其他可以記住的獨特角色嗎? 再次感謝 – Harsha 2010-05-18 10:42:48

2

一個抽象類具有一個奇異特性:可以創建沒有的類的實例。抽象類被設計爲用作其他抽象類和非抽象類的基類。

1

對於類abstract有任何意義,它必須有需要實現的抽象成員,否則它是無關的(除非你打算防止實例化),你應該刪除它。

它可能有一個抽象的財產的繼承人需要聲明,這樣

public abstract int ID { get; } 

或方法,它必須實現:

public abstract void DoSomething(); 

你會使用它,如果類本身是永遠不會被實例化,但您需要的不僅僅是一個接口,例如基本屬性,並且您希望稍後使用它:

((MyAbstractClass)obj).DoSomething(); //All inheritors implemented this 
1

一個抽象類有兩個相關的用途:

  1. 可以抽象成員放入類
  2. 不能創建抽象類的實例

抽象類的主要目的是服務於作爲後代類的基類,提供了可能的一些通用功能,但至少提供了後代必須實現的一套通用方法。例如,您可以使用抽象方法Eat創建一個抽象類Fruit。因爲你實際上不能吃一個「水果」,所以你需要吃一種特定類型的水果,課程是抽象的,你永遠不會看到一個在野外被標記爲「水果」的對象。

取而代之,您將看到蘋果,香蕉,橙子等類型的對象,它們是水果的後代,並且具有Eat的實際實現。

除了頂部的兩件事之外,抽象類沒有什麼特別之處。

1

我不認爲任何人還沒有說這個,但我相信一個抽象類的顯着特徵是:

編碼器知道如何之類的X%實現,以及如何(100 -X)%應該是實現的,但是不能是

這是什麼區別抽象類。接口描述了應該如何實現一個類,但是不要給實現者提供任何代碼或支持。具有虛擬方法的基類提供了繼承者可能覆蓋的默認實現。

它只是抽象類可以提供部分實現,但不能提供完整的實現。