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


当前回答

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

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

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

其他回答

关于抽象类的要点

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

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

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

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

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

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

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

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

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

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

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操作符的对偶。构造函数的唯一目的是在开始使用对象之前确保对象处于有效状态。只是我们通常通过一个新的运算符来调用它。