在.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()
{
}
}
声明虚拟事物意味着它可以被当前类的子类覆盖。然而,当一个类被实例化时,构造函数被调用。那时你不能创建有问题的类的子类,所以永远不需要声明构造函数虚拟。
不是直接的,但经典的Gang of Four模式工厂方法通过将实例化推迟到子类来实现什么等于虚拟构造器的排序。
不,它会如何工作?当您从基类派生子类时,必须调用层次结构中的所有构造函数。使构造函数虚拟将意味着否则。
可能被描述为具有类似行为的虚拟构造函数的东西是当您使用工厂模式时。试想一下这种情况:
class AnimalFactory
{
virtual Animal CreateAnimal(return new Animal("Cow"););
}
此工厂的默认行为是创建奶牛。但是,如果我们创建派生类:
class DogFactory : AnimnalFactory
{
override Animal CreateAnimal(return new Animal("Dog"););
}
我们现在正在创建狗。当然,这不是一个真正的虚拟构造函数(这是不可能的),这是虚拟构造。
如果我们看一下构造函数和虚拟这个词的定义,我们会得出一个逻辑结论,即构造函数不能是虚拟的。
真的吗?在Delphi中,虚拟构造函数是CLASS REFRENCE TYPES(“CLASS OF
你有权利,关于德尔福的虚拟构造函数,但这是语言规范的结果。你声明一个方法并声明这将是一个构造函数。方法名称与创建以往任何类型的类型无关。这是了解为什么一般虚拟构造函数的概念无效的关键。你可以声明一个工厂方法,甚至可以覆盖它。所以这种方式扭转了德尔福有虚拟方法,可以命名为构造函数,但它没有像其他C语言一样构造函数本身的结构。 – 2013-09-24 12:51:06
虚拟方法根据定义是基于接收器的运行时间类型分析而不是接收器的编译时静态类型分析来调度的方法。
构造函数是在创建特定类型的新实例时调用的方法。
由于新创建的对象的运行时类型为始终与编译时类型相同(*),因此不需要虚拟构造函数:运行时调度总是会选择与静态调度相同的方法,那么为什么要做出改变呢?
(*)这不完全正确;有一些涉及COM互操作的场景,其中构造的运行时类型不是编译时类型。传统互操作代码中的许多事情都很奇怪。
仅供参考,当人们都在问虚拟构造一个很好的模式来考虑是InversionOfControl
在.NET中,我们有一对夫妇IoC容器如ObjectBuilder的,团结,MEF,Spring.NET的。在Java中(可能会显示我的Java无能)有Spring,Tapestry和其他许多。
恕我直言,IoC是OO兑现其承诺的原因。
关于在派生类中调用基础构造函数:不会像通常那样链接基础,例如'public override InheritedClass():base()'。 – 2010-09-06 12:32:16
@paul ruane:你说的没错,但是我试图做的一点是重写基类是多余的,因为你要么明确地说明它,并用base()引用它,要么你不是,当对象被构造时,它会被调用,所以虚拟构造函数是毫无意义的 – lomaxx 2010-09-06 12:40:16
拥有虚拟构造函数是非常有意义的。这是各种构建器模式在不直接支持它的语言中实现的。 – 2010-09-06 16:32:14