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

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

如果是,为什么需要它?

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

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

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

如果你有:

public class BaseClass { public virtual BaseClass() { } } 

然后

 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() { } } 

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

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

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

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

不是直接的,但是经典的Gang of Four模式Factory Method通过将实例化推迟到子类来实现相当于虚拟构造函数的范畴。

不,它会如何运作? 从基类派生子类时,必须调用层次结构中的所有构造函数。 使构造函数虚拟化意味着其他方面。

当您使用工厂模式时,可能被描述为具有类似行为的虚拟构造函数的东西。 想象一下这种情况:

 class AnimalFactory { virtual Animal CreateAnimal( return new Animal("Cow"); ); } 

此工厂的默认行为是创建奶牛。 但是如果我们创建一个派生类:

 class DogFactory : AnimnalFactory { override Animal CreateAnimal( return new Animal("Dog"); ); } 

我们现在正在创造狗。 当然这不是真正的虚拟构造函数(这是不可能的),这是虚拟构造。

如果我们看一下构造函数和虚拟的定义,我们得出一个逻辑结论,即构造函数不能是虚拟的。

仅供参考,当人们要求虚拟构造函数时,一个非常好的模式是InversionOfControl

在.NET中,我们有几个IoC容器,如ObjectBuilder,Unity,MEF,Spring.NET。 在Java中(存在炫耀我的Java无能的风险)有Spring,Tapestry和许多其他人。

恕我直言IoC是OO实现其承诺的原因。

声明虚拟内容意味着它可以被当前类的子类覆盖。 但是,在实例化类时会调用构造函数。 那时你不能创建有问题的类的子类,所以永远不需要声明构造函数虚拟。