当虚拟构造函数中使用?(Where virtual constructors are used?)

2019-07-18 07:21发布

我也读到了用于实施一些设计模式虚拟的构造函数,但没有理解的任何需要虚拟构造函数。 那么,什么是虚拟构造函数和为什么我们真的需要他们?

Answer 1:

在大多数编程语言,据我所知,你不能找到虚拟构造函数。 其覆盖虚拟成员在运行时被评估对象的构造后,但在大多数语言中,你需要知道实际的类创建实例时。 因此虚拟构造函数使这些语言没有意义。

在.NET中,你可以通过反射类似的解决方案,即你可以通过一个表示要构造对象类型的类的实例构造一个对象。 并与通用的支持,你也可以达到类似的东西,但它不是虚拟的构造函数。

与具有真正的虚拟构造,我已经工作过的唯一的编程语言是德尔福。 在Delphi,有一个特定的“元类型”,即一个特定的编程构造表示元类(而在.NET,元类,所述Type类,只是一个普通的类的一个实例)。 所以,如果你有一个叫做类TMyClass - Deplhi命名约定;)

TMyClass : Class ...

你可以声明这样的元类

TMyMetaClass : class of TMyClass

现在,你可以声明一个变量是TMyMetaClass类型,

MyMetaClassVariable : TMyMetaClass
... 
// Assign the meta class to refer to our concrete class
MyMetaClassVariable := TMyClass;

你可以通过这个变量构造一个新的实例

MyClassInstance := MyMetaClassVariable.Create();

现在, MyMetaClassVariable可以指任何类,或者是TMyClass或其专业化。 如果构造被声明虚拟的,则该变量将被与该特定类的实例构造。

以同样的方式,你可以声明在Delphi的虚拟静态方法,并呼吁他们通过元类的实例。

所以其他的问题吗? 为什么我们需要它们? 那么,在Delphi中,他们解决一些相同的问题Type的.NET类,允许你构造对象,你不知道在设计时的类名。 例如,当你设计一个表格,你把一堆的控制,这个数据必须由设计师进行序列化,和反序列化。 当表单被反序列化,然后它实际上是被读出的元类型,和正确的情况下(无论是TextBoxComboBox ,等等)通过调用元类型的虚拟构造被构造。



文章来源: Where virtual constructors are used?