为什么可以在c#中编写抽象类的构造函数? 据我所知,我们不能实例化一个抽象类..那它是干什么用的呢? 你不能实例化类,对吧?


当前回答

因为在抽象类中可能有一种标准的方法来实例化数据。这样,就可以让继承自该类的类调用基构造函数。

public abstract class A{

    private string data;

    protected A(string myString){
      data = myString;
    }

}

public class B : A {

     B(string myString) : base(myString){}

}

其他回答

您可以在实现所有方法之后实例化它。然后将调用构造函数。

在可继承的具体类Thing中使用公共或内部存储类定义构造函数,有效地定义了两个方法:

一个作用于此的方法(我将称之为InitializeThing),没有返回值,只能从Thing的CreateThing和InitializeThing方法以及子类的InitializeXXX方法调用。 一个方法(我将调用CreateThing),它返回构造函数指定类型的对象,本质上表现为: CreateThing(int之类的) { Thing result = AllocateObject<Thing>(); Thing.initializeThing(无论); }

抽象类有效地只创建第一种形式的方法。从概念上讲,上面描述的两个“方法”没有理由需要具有相同的访问说明符;然而,在实践中,没有办法以不同的方式指定它们的可访问性。请注意,就实际实现而言,至少在。net中,CreateThing并不是真正实现为可调用方法,而是表示插入到newThing = newThing(23)的代码序列;声明。

你完全正确。我们不能实例化一个抽象类,因为抽象方法没有任何主体,即抽象方法不可能实现。但在某些情况下,你可能需要初始化基类的一些变量。 你可以通过使用@Rodrick建议的base关键字来做到这一点。在这种情况下,我们需要在抽象类中使用构造函数。

据我所知,我们不能实例化一个抽象类

这是你的误差。当然,您可以实例化一个抽象类。

abstract class Animal {}
class Giraffe : Animal {}
...
Animal animal = new Giraffe();

这里有一个动物的例子。通过创建从抽象类派生的具体类来实例化抽象类,然后实例化抽象类。请记住,派生的具体类的实例也是其抽象基类的实例。长颈鹿的实例也是动物的实例,即使动物是抽象的。

假设您可以实例化一个抽象类,它需要像任何其他类一样有一个构造函数,以确保它的不变量得到满足。

静态类是一个你实际上不能实例化的类,你会注意到在静态类中创建实例构造函数是不合法的。

下面有两个重要的特性可以防止继承Abstract类

抽象类必须有抽象方法,否则就不是抽象类 抽象类必须被派生类继承,因此,如果一个类被其他类继承,那么用什么来创建该类的对象