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


当前回答

我也想在抽象的表面上发光 所有的答案几乎涵盖了所有的事情。还是我的小钱

抽象类是有一些例外的普通类

该类的任何客户端/消费者都不能创建该类的对象 类,这并不意味着它的构造函数永远不会调用。它的派生类可以选择调用哪个构造函数。(如某些回答所描述) 它可能具有抽象的功能。

其他回答

抽象类可以有需要初始化的成员变量,因此可以在抽象类构造函数中初始化它们,并且在派生类对象初始化时调用该构造函数。

它的存在是为了执行抽象类的所有实现所需要的一些初始化逻辑,或者在抽象类上实现的任何方法(并不是抽象类上的所有方法都必须是抽象的,有些方法可以实现)。

任何继承自抽象基类的类都必须调用基构造函数。

关于抽象类的要点

抽象类不能被实例化。 抽象类可以有构造函数和析构函数。 抽象类不能是密封类,因为密封 修饰符阻止类被继承。 抽象类包含抽象成员和非抽象成员。 抽象类成员可以是私有的、受保护的和内部的。 抽象成员不能拥有私有访问修饰符。 抽象成员是隐式的虚成员,必须由 非抽象派生类。

加上上面的答案和例子。

是的,抽象类可以有构造函数,即使抽象类不能被实例化。将解释一个抽象类构造函数c#代码示例。但是,下一个问题也会出现,如果我们不能实例化一个抽象类(使用new构造一个对象),那么抽象类中的构造函数是什么,或者为什么我们应该在抽象类中使用构造函数?

注意,当创建派生类的对象时,隐式调用抽象基类的构造函数,尽管我们不能实例化抽象类。例如,在程序中,如果创建派生类的对象,则抽象基类构造函数也将被调用。

这也是一个例子

例子

abstract class A
{
    protected A() {Console.WriteLine("Abstract class constructor"); }
}
//Derived class
class B : A
{
   public B() {Console.WriteLine("Derived class constructor"); }
}

class Program
{
    static void Main(string[] args)
    {
        B obj = new B();
    }
}

输出将是

Abstract class constructor
Derived class constructor

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

public abstract class A{

    private string data;

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

}

public class B : A {

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

}