Могу ли я переопределить переменные, объявленные в классе с помощью VB.NET? - PullRequest
1 голос
/ 16 декабря 2010

Я пытаюсь создать универсальный класс контроллера для общих событий.Но эти эти события все еще должны получить доступ к их переменной класса.Поэтому моя идея состоит в том, чтобы создать базовый класс контроллеров с переменной ModelBaseclass в виде _ClassVar, которая наследуется всеми другими классами классов контроллеров.Но я хочу, чтобы производные классы контроллеров переопределяли _ClassVar на тот, который им нужен.

Я хочу сделать это, чтобы ControllerBaseClass мог иметь все общие функции, которые будут использовать все производные классы.1004 * Модель:

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

Контроллер:

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 ]

4 голосов
/ 16 декабря 2010

Благодаря полиморфизму нет причин, по которым вам нужно это делать.

И ModelDerivedClass1, и ModelDerivedClass2 наследуются от ModelBaseClass, поэтомуОбъявление переменной в вашем базовом классе как тип ModelBaseClass позволит вам сохранить объект любого из этих типов.Любой метод, определенный в базовом типе ModelBaseClass, автоматически доступен для производных типов.Если вам нужно вызвать метод, который определен только в одном из производных типов, вам нужно преобразовать объект в более конкретный тип:

DirectCast(_ClassVar, ModelDerivedClass1)


Как более конкретный и буквальныйответ на свой вопрос, вы не можете переопределить объявления переменных.Вы должны были бы объявить их как свойства, чтобы переопределить их объявления, и даже тогда вы не могли бы переопределить исключительно тип возвращаемого значения.

2 голосов
/ 16 декабря 2010

Как насчет использования 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
...