2011-07-27 62 views
2

我不熟悉使用abstract class無法創建抽象類或接口的實例

我想調用abstract class並得到這個錯誤Cannot create an instance of the abstract class or interface,我已經研究這個錯誤,但我真的很困惑這一點。

這裏是我的代碼:

 string B1String; 
     while ((B1String = OasisFile.ReadLine()) != null) 
     { 
      Questions_Base oQuestions_Base = new Questions_Base(); // error here 
      oQuestions_Base.Import(B1String); 
     } 

請諮詢我..謝謝!

+0

我想知道是否應該刪除抽象修飾符。班上沒有抽象成員。 – ChaosPandion

+0

只是看了這個。 http://www.programmersheaven.com/2/Les_CSharp_7_p1 –

+0

@Chaos:不一定。這可能是因爲Questions_Base不是一個完整的現實世界對象,而只是爲事物提供了通用的實現。 –

回答

8

一個抽象類,它作爲一個類層次結構,其中更多的派生類都有一些共同實施的一部分的目的

如果你有一個飛行模擬器,你可以定義一個抽象類ThingsThatFly,它實現了所有飛行事物都有的一些屬性(空速,高度,航向)和方法(TakeOff(),Land()),但將被宣佈爲摘要,因爲ThingsThatFly是所有具體事物的抽象概念。你當然也可以有類,例如Cessna172可以從繼承自ThingsThatFlyAirplane繼承。如果所有的飛機都有一些共同的實現,例如鳥類沒有(例如,燃料剩餘物)。

然後,你會有一些像Cessna 172,航天飛機和鴨子一樣飛翔的混凝土(=現實生活)的東西。其中每一個都是一個具體的類,從ThingsThatFly

這不同於具體類實現接口,如IThingsThatFly,因爲抽象類不僅提供預期的屬性和方法的定義,但還提供了這些屬性和方法的一個(希望有用的)實現。

3

抽象類只能被繼承。

public class CustomClass : Questions_Base { 
} 

這裏是關於抽象類以及如何使用它們的link

3

你不能創建一個抽象類的實例。

您需要定義一個繼承抽象類的具體類,並創建該類的一個實例。

2
  1. Abstract類被製成由派生類重寫。如果必須具有Abstract級別,請首先從中創建類Derived,並使用Derived類構造器。
  2. 如果不重要,只需從Questions_Base類聲明中刪除abstract字,這樣就可以製作出非抽象的聲明。也因爲在代碼提供我沒有看到任何abstract成員,所以這可能是一個正確的選擇。

問候。

2

抽象類不能被實例化。您必須提供該課程的實施。

abstract class Animal 
    { 
     public abstract void Speak() { } 
    } 

    public class Dog : Animal 
    { 
     public override void Speak() 
     { 
      Console.WriteLine("Woof"); 
     } 
    } 

MSDN抽象的更多信息

+1

呃呃...另一個動物的例子,用來解釋繼承.. – ChaosPandion

+1

它不是那種形狀...... :) –

2

從文檔:「抽象關鍵字使您能夠創建不完整的類和類成員,並且必須在派生類中實現。」

使用抽象的目的完全是爲了防止實例化,因爲您只創建了要用作基類的類,並且從不需要創建實例。

更多here

2

抽象類是必須被繼承的類。

它位於接口之間,該接口僅定義類必須實現的接口,並且沒有實現代碼,您可以創建一個類來定義接口和實現代碼。在.NET框架中有幾個抽象類,如CollectionBase。你不能創建一個CollectionBase的實例,它的目的是爲你創建一個從它繼承並擴展它的能力的類。

你應該簡單的能夠從你的類定義的Problems_Base中移除kwy工作「抽象」,或者創建一個從它繼承的新類定義。

0

由類定義中的關鍵字abstract標記的抽象類通常用於定義層次結構中的基類。關於它們的特殊之處在於,你不能創建它們的一個實例 - 如果你嘗試,你會得到一個編譯錯誤。相反,你必須繼承它們,正如繼承一章中所教導的那樣,並創建一個你的子類的實例。那麼你什麼時候需要一個抽象類?這真的取決於你做什麼。說實話,你可以在不需要抽象類的情況下走很長的路,但是對於特定的東西,比如框架,這很好,這就是爲什麼你會在自己的.NET框架內找到相當多的抽象類。一個好的經驗法則是,這個名字實際上是非常有意義的 - 抽象類經常用來描述抽象的東西,如果不是總是如此,抽象類更像是一個概念而不是真實的東西。