2011-09-14 1 views
2

VB.NET 4에서 종속 형식을 사용할 수 있는지 또는 기본 클래스의 생성자 매개 변수를 기반으로 상속 된 개체를 구성 할 수 있는지 궁금합니다. 예를 들어,VB.NET의 종속 형식

Class BaseClass 
    Sub New(type as String) 
     If type = "One" then 
      Me = New Child1 'Assignment to Me is syntax error, but it explains the concept... 
     Else 
      Me = New OtherChild 
     End If 
    End Sub 
End Class 

Class Child1 
    Inherits BaseClass 
... 

Class OtherChild 
    Inherits BaseClass 
.. 

.. 
Sub Main() 
    Dim c1 As New BaseClass("One") 
    Dim c2 As New BaseClass("Two") 
    OverloadedMethod(c1) 'Outputs One 
    OverloadedMethod(c2) 'Outputs Two 
End Sub 

Sub OverloadedMethod(C as Class1) 
    Console.Write("One") 
End Sub 

Sub OverloadedMethod(C as OtherClass) 
    Console.Write("Two") 
End Sub 

EDIT : 종속 유형에 대한 설명, (. 예컨대 스칼라 값)

Dependent types 어떤 파라미터에 기초하여 구성되는 유형이다. 이것은 일부 (주로 기능적) 프로그래밍 언어 (예 : 하스켈)에서 잘 알려진 개념입니다. 예를 들어, 의존적 유형을 지원 가상의 필수 언어로, 하나는 쓸 수 있습니다 :

Matrix(3,10) A; //A is a 10x10x10 3D Matrix 
Matrix(2,3) B; //B is a 3x3 2D Matrix 

그리고

A(0,0,0) = 10; 
B(0,0) = -2; 
B(1,1,0) = 5; // Type Error 

답변

4

편집 : 귀하의 의견을 감안하면, 내가 의존 유형에 대한 인식하지 않았다. 그것들은 아직 객체 지향 프로그래밍 언어로 구현되지 않은 것 같습니다. 두 가지를 결합하는 것에 대해서는 research이 있습니다. 아직 AFAIK 구현 단계에 있지 않은 것으로 보입니다.

현재 constructor은 구성중인 유형 (예 : BaseClass) 이외의 것을 구성 할 수 없습니다.

가장 가까운 번호는 abstract factory입니다. 즉 (I 문자열을 유지하고, 단순화를위한 정적 방법을 만들었지 만, 그것은 일반적으로 자세한 내용은 그것에 대해 읽어 패턴의 일부이다)과 같을 것이다 :

Class ClassFactory 
     Public Shared Function GenerateBaseClassObject(type As String) As BaseClass 
     If type = "One" Then 
      Return New Child1 
     Else 
      Return New OtherChild 
     End If 
     End Function 
    End Class 

의 다른 부분에 질문, 오버로드, 그건 단지 객체 계층 구조 외부에서 메서드를 정의하기가 더 어려워 질 것입니다. 보시다시피, 추상 팩토리는 BaseClass을 반환하고 누구도 팩토리 외부와 생성 된 객체를 알지 못합니다. 실제 유형은 무엇입니까 (반사 및 캐스팅을 고려하지 않으면이 시점에서 혼란 스러울 것입니다).). 두 종류의 클래스 간의 차이점을 캡슐화하기 위해 오브젝트 계층을 재 작업해야합니다.

코드의 전체 작업 리팩토링은 다음과 같이 보일 것이다 :

MustInherit Class BaseClass 
     Public MustOverride Sub Output() 
    End Class 

    Class Child1 
     Inherits BaseClass 

     Public Overrides Sub Output() 
     Console.Write("One") 
     End Sub 
    End Class 

    Class OtherChild 
     Inherits BaseClass 

     Public Overrides Sub Output() 
     Console.Write("Two") 
     End Sub 
    End Class 

    Class ClassFactory 
     Public Shared Function GenerateBaseClassObject(type As String) As BaseClass 
     If type = "One" Then 
      Return New Child1 
     Else 
      Return New OtherChild 
     End If 
     End Function 
    End Class 

    Sub Main() 
     Dim c1 As BaseClass = ClassFactory.GenerateBaseClassObject("One") 
     Dim c2 As BaseClass = ClassFactory.GenerateBaseClassObject("Two") 
     c1.Output() 
     c2.Output() 
     Console.ReadLine() 
    End Sub