VB.NET - 调用多个构造函数

问题描述:

我是一名c#开发人员,并没有足够的VB.NET经验。VB.NET - 调用多个构造函数

场景:“构造函数调用只适用在实例构造函数的第一个语句”

Namespace Presenters 
    Public Class BaseFooPresenter 

     ' assuming the public default parameterless constructor 

     Public Sub New(ByVal strvar As String) 
      ' TODO with strvar variabile 
     End Sub 

    End Class 

    Public Class FooPresenter 
      Inherits BaseFooPresenter 

     Public Sub New(ByVal boolvar As Boolean) 
      ' TODO with boolvar variabile 
     End Sub 

     Public Sub New(ByVal boolvar As Boolean, _ 
         ByVal objvar As Object) 
      MyBase.New(String.Empty) 
      Me.New(true) 
      ' TODO with objvar variabile 
     End Sub 

    End Class 
End Namespace 

有了这个代码在第二FooPresenter构造我得到一个错误

在:

  Me.New(true) 

如果我颠倒我得到错误的顺序:

  MyBase.New(String.Empty) 

我可以创建一个方法setValues方法(... ...参数)和调用它两个构造函数,但有人knwos解决方法,以避免此错误?,为什么编译器不验证在重载的构造函数之前调用基础构造函数的可能性?

是否有人知道如何从逻辑上证明无法同时从一个类级构造函数调用基类构造函数和另一个类级构造函数的事实?

+0

对不起@Moonlight因为我在计算器非常新,我没有足够的信誉分数(在今14)投票的答案:( – manuellt 2011-12-29 11:09:49

+3

可以在你自己的问题上标记答案(不是投票薄,标记为答案) – Moonlight 2011-12-29 11:12:59

+2

thanx @Moonlight为你的建设性的方法,我现在标记答案:) – manuellt 2011-12-29 11:27:42

的问题是,一旦你指定一个参数的构造函数,参数的构造函数变成私人除非明确你另有规定。

因此,修改ken2K代码:

Namespace Presenters 
    Public Class BaseFooPresenter 

     ' SPECIFYING the protected default parameterless constructor 
     ' can also be public 
     Protected Sub New() 

     End Sub 

     Public Sub New(ByVal strvar As String) 
      ' TODO with strvar variabile 
     End Sub 

    End Class 

    Public Class FooPresenter 
     Inherits BaseFooPresenter 

     Public Sub New(ByVal boolvar As Boolean) 
      MyBase.New() 
      ' TODO with boolvar variabile 
     End Sub 

     Public Sub New(ByVal boolvar As Boolean, _ 
         ByVal objvar As Object) 
      Me.New(boolvar) 
      ' TODO with objvar variabile 
     End Sub 

    End Class 
End Namespace 
+0

你好@MA Hanin,我需要第一个FooPresenter构造函数调用无参数基构造函数,第二个FooPresenter构造函数在调用基重载基构造函数之前/之后首先调用第一个FooPresenter构造函数,我认为这是不可能的。 – manuellt 2011-12-29 12:37:57

你不能像这样调用多个构造函数。就像在C#中一样,您只能调用一个初始化程序。

就像C#一样,您不能同时拨打this()base()。 这里是你应该做的:

Namespace Presenters 
    Public Class BaseFooPresenter 

     ' assuming the public default parameterless constructor 

     Public Sub New(ByVal strvar As String) 
      ' TODO with strvar variabile 
     End Sub 

    End Class 

    Public Class FooPresenter 
      Inherits BaseFooPresenter 

     Public Sub New(ByVal boolvar As Boolean) 
      MyBase.New(String.Empty) 
      ' TODO with boolvar variabile 
     End Sub 

     Public Sub New(ByVal boolvar As Boolean, _ 
         ByVal objvar As Object) 
      Me.New(boolvar) 
      ' TODO with objvar variabile 
     End Sub 

    End Class 
End Namespace 
+0

嗨@ ken2k,重要的是第一个构造函数不要调用重载的基类构造函数,第一个构造函数必须事先调用隐式无参数基类构造函数thanx。 – manuellt 2011-12-29 11:49:08

+1

@manuellt:'第一个构造函数调用隐式无参数基类构造函数势在必行' 为什么?看起来你只是用这个要求为自己的背部制作一根杆子。 – 2011-12-29 15:44:29

+0

@Robin Brown,thanx为了您的观察,FooPresenter使用基类中创建的对象(如果使用无参数OR或堆栈中的静态对象进行构造),如果使用重载构造函数调用,则将其传递给基类,若干现有类从这个基类中获取信息,我只想找到影响较小的方法来实现一些现有类和新类的新行为。 – manuellt 2011-12-29 16:54:16