为什么可以在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)的代码序列;声明。