"C#错误信息:无法创建抽象类或接口的实例"

9

我将项目中的基类更改为abstract,现在我收到以下错误:

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

我收到这个错误是因为不允许命名一个abstract类的新实例吗?

newPlane = new Airplane_Abstract(name, position);

1
框架指南 框架指南 框架指南 框架指南 - user1228
2
当你回头去读一下有关抽象类的内容时,你会扇自己一个耳光并说“傻眼”。http://msdn.microsoft.com/en-us/library/sf985hc5(v=vs.71).aspx(第一个要点) - Joel Etherton
5
你是在指类型名称中的下划线吗?我问这个问题是因为我现在认为自己在.NET方面相当有知识水平(而且我认为那是你的意思),但我甚至不能100%确定那个注释的含义。所以我怀疑对于一个相当新手的人来说,它的含义可能并不是非常清楚的。 - Dan Tao
3个回答

18

你无法创建抽象类的实例。可以将其视为包含一些实现逻辑的接口。如果调用没有定义的抽象实例方法,你会期望发生什么?


当然,您可以创建一个继承“抽象”类的具体类的实例,这样的实例也可以被称为抽象类的实例。 - Jeppe Stig Nielsen
@JeppeStigNielsen:抽象类是声明了抽象方法的类。你不能创建抽象类的实例(编译器会告诉你!),当然,你可以创建非抽象子类的实例,但这不是问题的重点(问题在近六年前已经被提出……)。你想说什么? - Ed S.
这只是一个术语上的评论。许多人会将子类的实例称为基类的实例。例如,可以参考Eric Lippert在另一帖子中的回答。你的回答当然是完全正确的,我只是想说还有这个常见的术语。 - Jeppe Stig Nielsen

14

我看到了你之前的问题,你问的是"pure virtual"的意思(在C#中是abstract)。

你不能实例化一个abstract类的原因是它很可能有abstract成员,且没有实现。所以,如果你的类看起来像这样:

abstract class Airplane_Abstract
{
    public abstract int GetSomeInteger();
}

假设你能实例化其中之一,你可以编写如下代码:

var airplane = new Airplane_Abstract();

// What would this be?
int integer = airplane.GetSomeInteger();

虽然我不认为你必须在抽象类中有抽象成员,但抽象类的一般概念是它不能单独存在;必须进一步通过继承它的类进行定义。 抽象成员是这种情况最明显的例子;可能还有其他原因。

例如,考虑 Shape。 这是一个相当常见的抽象类示例。 你不能真正地实例化一个只是一个 Shape,对吗?(“创建一个形状。”“什么样的形状?”“没有样式,只是抽象形状。”不太可行,对吧?)


6

你不能创建一个抽象类的实例。这就是 抽象 的意思。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接