2010-12-16 2 views
1

제네릭 이벤트에 대한 일반 컨트롤러 클래스를 만들려고합니다. 그러나 이러한 이벤트는 여전히 클래스 변수에 액세스해야합니다. 그래서 내 생각은 BaseClass 클래스를 ModelBaseclass 변수와 함께 _ClassVar로 생성하는 것인데,이 클래스는 다른 클래스의 Controller 클래스에서 파생 될 모든 클래스에서 상속됩니다. 하지만 파생 된 컨트롤러 클래스가 _ClassVar를 필요로하는 것으로 우선 적용하길 바란다.VB.NET을 사용하여 클래스에서 선언 된 변수를 무시할 수 있습니까?

저는 이것을 원합니다. ControllerBaseClass는 모든 파생 클래스가 사용할 일반 함수를 모두 가질 수 있습니다.

모델 :

Public Class ModelBaseClass 
    Public Overridable Function Foo() As String 
     Return "Name" 
    End Function 
End Class 

Public Class ModelDerivedClass1 
    Inherits ModelBaseClass 
    Public Overrides Function Foo() As String 
     Return "ModelDerivedClass1" 
    End Function 
End Class 

Public Class ModelDerivedClass2 
    Inherits ModelBaseClass 
    Public Overrides Function Foo() As String 
     Return "ModelDerivedClass2" 
    End Function 
End Class 

컨트롤러 : polymorphism

Public Class ControllerBase 
      Public Overridable _ClassVar As ModelBaseClass  <---- 
    Public Function PrintFoo() As String       
     Return _ClassVar.Foo() 
    End Function 
End Class 

Public Class ControllerDerivedClass1 
    Inherits ControllerBase 
     Public Overrides _ClassVar As ModelDerivedClass1  <---- 
End Class 

Public Class ControllerDerivedClass2 
    Inherits ControllerBase 
     Public Overrides _ClassVar As ModelDerivedClass2  <---- 
End Class 

답변

2

방법이 하나 Generics 사용에 대한 :

Public Class ControllerBase(Of T As ModelBaseClass) 
    Private _ClassVar As T 
    Public Property ClassVar() As T 
     Get 
      Return _ClassVar 
     End Get 
     Set(ByVal value As T) 
      _ClassVar = value 
     End Set 
    End Property 

    Public Function PrintFoo() As String 
     Return ClassVar.Foo() 
    End Function 
End Class 

Public Class ControllerDerivedClass1 
    Inherits ControllerBase(Of ModelDerivedClass1) 
    ' No need to declare this 
    ' Public Overrides _ClassVar As ModelDerivedClass1  <---- 
End Class 

Public Class ControllerDerivedClass2 
    Inherits ControllerBase(Of ModelDerivedClass2) 
    ' No need to declare this 
    ' Public Overrides _ClassVar As ModelDerivedClass2  <---- 
End Class 
+0

-1 Overcomplicates을 _ClassVar 또는 OP 같은 "명시 적"다형성 구현하려고했다가 필요가 없다는 것을 실현하지 않고. – siride

+0

이것은 지나치게 복잡하지 않습니다. 가장 간단한 형식의'Generics'. – decyclone

+0

일반적인 접근법으로는 문제가 발생하지 않습니다. Cody grays 대답이나 decyclone이 작동합니다. 코디의 접근 방식은 컨트롤러가 각 파생 된 클래스에 고유 한 모델에서 기능을 사용해야하는 경우 약간의 캐스팅을 필요로하고 + MIGHT +는 일부 제한된 이점을 제공합니다. – DarinH

4

덕분에, 당신은이 작업을 수행해야 할 이유가 없습니다.

모두 ModelDerivedClass1ModelBaseClass에서 ModelDerivedClass2 상속, 그래서 당신이 그 유형 중 하나의 객체를 저장할 수 있습니다 유형 ModelBaseClass와 같은 기본 클래스에서 변수를 선언. 기본 형식 ModelBaseClass에 정의 된 모든 메서드는 파생 형식에서 자동으로 사용할 수 있습니다. 당신은 단지 파생 된 유형 중 하나에 정의 된 메소드를 호출해야하는 경우, 당신은 더 특정 유형의 객체를 업 캐스팅해야합니다 :에 대한보다 구체적이고 문자 답변으로

DirectCast(_ClassVar, ModelDerivedClass1) 


당신의 질문, 당신은 변수 선언을 무시할 수 없습니다. 그들의 선언을 오버라이드 (override)하기 위해서 프로퍼티로서 선언 할 필요가 있습니다 만, 리턴 타입에 의해 오버라이드 (override) 할 수 없습니다.

관련 문제