在.NET中,类可以有虚拟构造函数吗?

Ram*_*Ram 22 .net c# oop

一个类可以有虚拟构造函数吗?

如果是,为什么需要它?

lom*_*axx 24

不,一个类不能有虚拟构造函数.

拥有一个虚拟构造函数是没有意义的.在C#中构造对象的顺序是首先构造派生类,因此总是调用派生的构造函数,因为要调用的类在构造时是众所周知的.

另一件事是,如果您实际输入此代码,您可以很快发现它完全没有意义

如果你有:

public class BaseClass 
{
    public virtual BaseClass()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

public class InheritedClass : BaseClass
{
    //overrides baseclass constructor but why would you do this given that the     
    //constructor is always going to be called anyway??
    public override InheritedClass()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 拥有虚拟构造函数非常有意义.这是各种构建器模式在不直接支持它的语言中实现的. (9认同)
  • 我不同意构造函数的执行顺序,即First Derived和Base.在c#Base类构造函数中,总是会在Derived类构造函数之前调用它. (2认同)

Eri*_*ert 12

根据定义,虚方法是基于接收器的运行时类型分析而不是接收器的编译时静态类型分析来调度的方法.

构造函数是在创建特定类型的新实例时调用的方法.

由于新创建的对象的运行时类型始终与其编译时类型相同(*),因此不需要虚拟构造函数:运行时调度将始终选择与静态调度相同的方法,因此为什么要打扰区别?

(*)这不完全正确; 存在涉及COM互操作的场景,其中构造的运行时类型不是编译时类型.遗留互操作代码世界中很多东西都很奇怪.


Cum*_*yah 5

不是直接的,但是经典的Gang of Four模式Factory Method通过将实例化推迟到子类来实现对各种虚拟构造函数的贡献.