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


当前回答

关于抽象类的要点

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

其他回答

通常构造函数涉及初始化正在创建的对象的成员。在继承的概念中,通常继承层次结构中的每个类构造函数都负责实例化自己的成员变量。这是有意义的,因为实例化必须在定义变量的地方进行。

由于抽象类不是完全抽象的(不像接口),它是抽象成员和具体成员的混合,非抽象成员需要初始化,这是在抽象类的构造函数中完成的,因此在抽象类中有必要有构造函数。当然,抽象类的构造函数只能从派生类的构造函数调用。

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

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

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

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

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

这是一种强制抽象类的一组不变量的方法。也就是说,无论子类做什么,你都想确保基类的某些事情总是正确的……例子:

abstract class Foo
{
    public DateTime TimeCreated {get; private set;}

    protected Foo()
    {
         this.TimeCreated = DateTime.Now;
    }
}

abstract class Bar : Foo
{
    public Bar() : base() //Bar's constructor's must call Foo's parameterless constructor.
    { }
}

不要把构造函数看作new操作符的对偶。构造函数的唯一目的是在开始使用对象之前确保对象处于有效状态。只是我们通常通过一个新的运算符来调用它。