2011-12-29 3 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을 만들어에서 호출 할 수 있습니다 두 생성자가 있지만 누군가가이 오류를 피하기위한 해결 방법을 알고 있습니까? 왜 컴파일러는 오버로드 된 생성자보다 먼저 기본 생성자를 호출 할 가능성을 확인하지 못합니까?

기본 클래스 생성자와 다른 클래스 수준 생성자를 동시에 하나의 클래스 수준 생성자에서 호출 할 수 없다는 사실을 논리적으로 정당화하는 방법을 아는 사람이 있습니까?

+0

죄송 @Moonlight을 내가 유래 매우 새로 온 사람 때문에 내가 답변 :( – manuellt

+3

당신이 할 수있는 투표를 (현재 14) 충분한 명성 점수가 없습니다 자신의 질문에 답을 표시하십시오 (투표가 얇은 것, 대답으로 표시하지 마십시오) – Moonlight

+2

thanx @ 당신의 건설적인 접근을위한 mlightlight, 지금 답변을 표시하고 있습니다.) – manuellt

답변

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

안녕하세요 @ 석사 Hanin, 나는 첫 번째 FooPresenter 생성자를 호출하기 전에 매개 변수없는 기본 생성자와 두 번째 FooPresenter 생성자를 호출하는 첫 번째 FooPresenter 생성자가 필요합니다. 기본/overloaded 기본 생성자를 호출하기 전에 호출 할 수 없습니다. – manuellt

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

+1

@manuellt : '첫 번째 생성자가 암시 적 매개 변수없는 기본 클래스 생성자를 호출하는 것이 중요합니다.' 왜? 당신이이 요구 조건을 가지고 당신 자신의 등받이를 만드는 것처럼 보입니다. –

+0

@Robin Brown, 당신의 관찰을 위해 고맙습니다. FooPresenter는 overloaded 생성자를 사용하여 호출 된 경우, 매개 변수없는 OR로 구성된 경우 기본 클래스에서 생성 된 객체를 사용합니다. 또는 기본 클래스, 여러 기존 클래스 이 기본 클래스에서 ereditates 그리고 난 단지 일부 기존 클래스와 새로운 것들에 새로운 행동을 구현하는 덜 영향을 미치는 방법을 찾고 싶어요. – manuellt