2009-04-25 8 views
39

Dim TestChild As ChildClass = New ChildClass("c")에 컴파일 오류VB에서 매개 변수를 사용하여 하위 새 (생성자)를 상속 할 수 있습니까? 나는 아래의 코드에서

Error Too many arguments to 'Public Sub New()' 

을받을 수 있습니다. 그들은 모두 상속 오전 기본 클래스에 있습니다 비록 내가 TestChild.Method1()에 그것을받지 않습니다. 아래의 제안으로

Public Class ChildClass 
    Inherits BaseClass 
     Public Sub New (ByVal SetText As String) 
     MyBase.New(SetText) 
    End Class 
End Class 

하지만 난 방법 1 또는 다른 상속 방법을 위해 그렇게 할 필요가 없습니다 나는 가능한 한 깨끗한 코드를 찾고 있어요 :

Public Class BaseClass 
    Public ReadOnly Text As String 
    Public Sub New(ByVal SetText As String) 
     Text = SetText 
    End Sub 
    Public Sub New() 
     Text = "" 
    End Sub 
End Class 

Public Class ChildClass 
    Inherits BaseClass 
End Class 

Public Class TestClass 
    Sub Test() 
     Dim TestChild As ChildClass = New ChildClass("c") 
     TestChild.Method1() 
    End Sub 
End Class 

나는에 자식 클래스를 변경할 수 있습니다. 이것은 매개 변수화 된 New 문을 상속 한 시스템의 제한 일 수 있지만 어디에서나 문서화 된 것을 찾을 수는 없습니다. 필요한 경우 설명서를보고 싶습니다.

답변

51

동작 :

다음은 C++에 대한 같은 질문 한 관련 게시물입니다. 하위 클래스는 기본 유형의 생성자를 상속하지 않습니다. 자식 클래스는 자신의 생성자를 정의 할 책임이 있습니다. 또한 그것은 각 생성자가 암시 적으로 또는 명시 적으로 기본 클래스 생성자를 호출하거나 동일한 유형의 다른 생성자에 연결되도록 정의해야합니다.

모든 하위 클래스에 동일한 생성자를 정의하고 MyBase.New를 통해 명시 적으로 기본 생성자로 다시 연결해야합니다. 예

Class ChildClass 
    Inherits BaseClass 
    Public Sub New(text As String) 
    MyBase.New(text) 
    End Sub 
End Class 

당신이 찾고있는 문서는 VB 언어 사양의 섹션 9.3.1입니다. http://msdn.microsoft.com/en-us/library/aa711964(VS.71).aspx

  • 내가 가장 관련성이 섹션에서는 기본 생성자가 자동이며, 종류는 더 인스턴스 생성자 선언을 포함하지 않는 경우

    를 (대략 두 번째 페이지의 시작) 다음과 같은 생각 제공됩니다. 기본 생성자는 직접 기본 유형의 매개 변수없는 생성자를 호출하기 만합니다.

    이것은 하위 클래스가 생성자를 상속하지 않지만 명시 적으로 부작용이 있음을 명시하지 않습니다.

+1

JaredPar, 명확한 대답을 주셔서 감사하며 문서를 가리 킵니다. 가능한 경우 세부 정보를 얻을 수 있도록 출처를 갖고 싶습니다. –

+1

좋은 설명이지만이 일을 할 수없는 이유가 궁금합니다. 그것을 허용하는 것은 간단 할 것이다. –

+1

이제 문서 링크를 클릭하면 "Visual Studio 2003 Retired Technical Documentation"텍스트가있는 페이지가 생성됩니다. – JohnH

7

매개 변수화 된 생성자는 인스턴스 메소드와 같은 방법으로 상속 될 수 없습니다. 자식 클래스에 생성자를 구현 한 다음 MyBase를 사용하여 부모의 생성자를 호출해야합니다.

Public Class ChildClass 
    Inherits BaseClass 

    Public Sub New (ByVal SetText As String) 
     MyBase.New(SetText) 
    End Class 
End Class 

Public Class TestClass 
    Public TestChild AS New ChildClass("c") 
End Class 

이 제한은 VB와 관련이 없습니다. 내가 수집 할 수있는 것부터, C#, Java 또는 C++에서는 불가능합니다. 당신이 "디자인"입니다보고있다
c-superclass-constructor-calling-rules

+0

제안 해 주셔서 감사합니다. Visual Studio에서 제안한대로 코드를 업데이트했지만 여전히 동일한 컴파일 오류가 발생합니다. 나는 또한 다른 사람들이 귀하의 제안을 통합 볼 수 있도록 게시물을 업데이 트했습니다. 다른 아이디어? –

+0

죄송합니다. 게시물을 잘못 읽었습니다. 목표는 새 메서드를 상속하므로 모든 자식 클래스에서 코드를 반복하지 않아도됩니다.제안한 것처럼 하위 클래스에서 코딩하지 않고 기본 클래스의 새 메서드에 액세스하려면 어떻게해야합니까? –

+0

호세, 나는 명료하게 편집했다. 자식 클래스에 메서드 1을 구현할 필요가 없습니다. 자식 클래스에 생성자를 구현해야한다는 요구 사항이 있습니까? 그들은 직접 상속받을 수 없습니까? –