2011-12-29 59 views
9

我是一名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

回答

16

的問題是,一旦你指定一個參數的構造函數,參數的構造函數變成私人除非明確你另有規定。

因此,修改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

2

你不能像這樣調用多個構造函數。就像在C#中一樣,您只能調用一個初始化程序。

4

就像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