无法创建抽象类或接口的实例

时间:2011-07-27 20:12:33

标签: c# abstract-class

我不熟悉使用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);
        }

请建议我..谢谢!

8 个答案:

答案 0 :(得分:8)

抽象类的目的它作为类层次结构的一部分,其中更多派生类共享一些常见的实现。

如果您有飞行模拟器,您可以定义一个抽象类ThingsThatFly来实现所有飞行物具有的一些属性(空中速度,高度,航向)和方法(TakeOff(),Land())通用,但会被声明为 abstract ,因为ThingsThatFly是所有飞行的具体事物的抽象。您当然也可以在中间使用类,例如Cessna172可以从继承自Airplane的{​​{1}}继承。如果所有飞机都有一些共同的实施,例如,你会这样做鸟类没有(例如,剩余燃料)。

然后你会有一些具体(=现实生活)的东西像塞斯纳172,航天飞机和鸭子一样飞翔。其中每一个都是一个源自ThingsThatFly

的具体类

这与具体类实现诸如ThingsThatFly之类的接口不同之处在于,抽象类不仅提供了所期望的属性和方法的定义,而且还提供了(希望有用的)实现。那些属性和方法。

答案 1 :(得分:3)

Abstract类只能被继承。

public class CustomClass : Questions_Base {
}

以下是关于抽象类以及如何使用它们的link

答案 2 :(得分:3)

您无法创建抽象类的实例。

您需要定义一个继承抽象类的具体类,并创建该实例。

答案 3 :(得分:2)

  1. Abstract类被Derived类覆盖。如果您必须拥有Abstract类,请先从中创建一个Derived类,然后使用Derived类构造函数。
  2. 如果它不重要,只需从abstract类声明中删除Questions_Base单词,这样就可以使其成为非抽象单词。另外,因为在提供的代码中我没有看到任何abstract成员,所以这个可能是正确的选择。
  3. 问候。

答案 4 :(得分:2)

无法实例化抽象类。您必须为该类提供实现。

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

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

有关详情,请参阅摘要上的MSDN

答案 5 :(得分:2)

来自文档:“abstract关键字使您能够创建不完整的类和类成员,并且必须在派生类中实现。”

使用abstract的目的正是为了防止实例化,因为你只创建了用作基类的类,并且从不想要创建实例。

更多here

答案 6 :(得分:2)

抽象类是必须继承的类。

介于接口之间,接口只定义类必须实现的接口,没有实现代码,以及可以创建定义接口和实现代码的实例的类。 .NET框架中有几个抽象类,如CollectionBase。您无法创建CollectionBase的实例,它旨在创建一个继承自它的类并扩展它的功能。

您应该能够简单地从Questions_Base的类定义中删除kwy工作“abstract”,或者创建一个继承自它的新类定义。

答案 7 :(得分:0)

抽象类(由类定义中的关键字abstract标记)通常用于在层次结构中定义基类。它们的特殊之处在于,您无法创建它们的实例 - 如果您尝试,您将收到编译错误。相反,您必须按照继承章节中的教导对它们进行子类化,并创建子类的实例。那么你什么时候需要一个抽象类呢?这取决于你做了什么。说实话,你可以在不需要抽象类的情况下走很长的路,但它们对于特定的东西很有用,比如框架,这就是为什么你会在它自己的.NET框架中找到相当多的抽象类。一个好的经验法则是名称实际上非常有意义 - 抽象类经常(如果不是总是)用于描述抽象的东西,更多的是概念而不是真实的东西。