【问题标题】:How do shared members from a base class react when a derived object is instantiated when the base class is not in VB.Net?当基类不在 VB.Net 中时实例化派生对象时,基类中的共享成员如何反应?
【发布时间】:2011-10-25 16:45:55
【问题描述】:

问题很直接,在我的任何准备中都找不到答案。 在 VB.Net 中未实例化基类时,当实例化派生对象时,基类中的共享成员如何反应?共享构造函数是否在基层被调用?我试图弄清楚基类是否在基类中定义的shared new() 方法中初始化一组共享成员,实例化的衍生类是否可以访问,给定适当的访问器,如果基类没有被实例化?

Public Class Car
   Protected Shared _carCount as Integer

   Shared Sub New()
       _carCount = 0
   End Sub

   Shared Public Function GetCount() as integer
       return _carCount
   End Sub
End Class

Public Class Sedan
    Inherits Car

    Shared Sub New()
        _carCount = _carCount + 1
    End Sub
End Sub


Sub Main()
    Dim someSedan as New Sedan

    System.Console.Writeline(someSedan.GetCount())

End Sub

这段代码没有经过检查,但它应该足以说明我在说什么。

【问题讨论】:

  • 您需要提供更多详细信息。你在说什么语言?你是什​​么意思“共享”构造函数?
  • @x0n - 在 VB.NET 中,shared 就是您在 C# 中所称的 static
  • 另外,如何在不实例化基类的情况下实例化派生类?你能举个例子吗?
  • @hydroparadise,AFAIK 你做不到。那么你能提供一些你在做什么的代码吗?

标签: .net inheritance shared static-members


【解决方案1】:

"在VB.Net中基类没有实例化时,派生对象被实例化了?"

当您实例化派生类时,总是会调用基类构造函数。类型实例的构造函数首先隐式调用该类型的基类构造函数——即使您没有显式选择构造函数,也会运行默认构造函数。

共享构造函数是否在基础级别被调用?

是的。共享构造函数将在第一次访问基类 type 之前的某个时间点被调用。这包括派生类的实例化,因为派生类的任何实例都会自动(隐式)调用基类构造函数。这反过来又会强制访问该类型。

CLI 规范保证所有共享(静态)构造函数都将在此发生之前运行。您不必担心 - 您的共享成员都将在使用之前通过共享构造函数进行初始化。

【讨论】:

    【解决方案2】:

    共享成员(C# 中的静态)不关心实例化,因此它们将按照预期执行。第一次使用类型时调用共享构造函数,因此您的子类将调用它的共享构造函数,然后调用基类的

    由于共享(静态)不能被继承,它们都会运行。

    如果成员集是静态的,那么它们将在该 TYPE 上“初始化”。同样,您不能继承共享(静态)成员。您必须从基类显式调用它们才能从子类“初始化”它们

    只要是从另一种语言派生的,没关系。它的工作方式相同。到头来都是IL。

    如果你想初始化一个子类而不是基类,那么你需要使用组合,而不是继承。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 2012-09-17
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多