2010-12-16 10 views
1

Ich versuche, eine generische Controller-Klasse für generische Ereignisse zu erstellen. Aber diese Ereignisse müssen immer noch auf ihre Klassenvariable zugreifen. Meine Idee ist also, die Base Controller Class mit einer ModelBaseclass-Variablen als _ClassVar zu erstellen, die von allen anderen Klassen abgeleitet wird, von denen Controller-Klassen abgeleitet werden. Aber ich möchte, dass die abgeleiteten Controller-Klassen die _ClassVar mit dem von ihnen benötigten überschreiben.Kann ich mit VB.NET deklarierte Variablen in einer Klasse überschreiben?

Ich möchte dies tun, damit die ControllerBaseClass alle generischen Funktionen haben kann, die alle abgeleiteten Klassen verwenden würden.

Modell:

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 

Controller:

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 

Antwort

2

Wie wäre es mit Generics für diese:

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 ohne zu merken, dass es keine Notwendigkeit für _ClassVar oder „explicit“ Polymorphismus wie die OP versuchte, zu implementieren. – siride

+0

Dies ist keine übermäßige Komplikation. Seine 'Generics' im einfachsten Format. – decyclone

+0

Ich muss sagen, ich sehe kein Problem mit dem generischen Ansatz. Entweder Cody Grays Antwort oder decyclones würde funktionieren. Codys Ansatz erfordert ein wenig mehr Casting und + MIGHT + bietet einige begrenzte Vorteile, wenn der Controller die Funktionalität in den spezifischen Modellen für jede abgeleitete Klasse verwenden müsste, aber das ist es auch schon. – DarinH

4

Dank polymorphism, gibt es keinen Grund, warum Sie sollten dies zu tun haben.

Sowohl ModelDerivedClass1 und ModelDerivedClass2 vererben ModelBaseClass, so die Variable in der Basisklasse als Typ deklarieren ModelBaseClass ermöglicht es Ihnen, ein Objekt von einem dieser Typen zu speichern. Jede Methode, die im Basistyp ModelBaseClass definiert ist, ist automatisch für die abgeleiteten Typen verfügbar. Wenn Sie eine Methode aufzurufen, die nur in einer der abgeleiteten Typen definiert ist, müssen Sie das Objekt zu einem bestimmten Typs upCast:

DirectCast(_ClassVar, ModelDerivedClass1) 


Als ein spezifischeres und wörtliche Antwort auf Ihre Frage, Sie können Variablendeklarationen nicht überschreiben. Sie müssten sie als Eigenschaften deklarieren, um ihre Deklarationen zu überschreiben, und selbst dann könnten Sie nicht ausschließlich nach Rückgabetyp überschreiben.

Verwandte Themen