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

时间:2010-09-06 12:15:49

标签: c# .net oop

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

如果是,为什么需要它?

7 个答案:

答案 0 :(得分:23)

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

拥有虚拟构造函数是没有意义的。在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()
    {
    }
}

答案 1 :(得分:12)

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

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

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

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

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

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

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

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