Полиморфизм и слежка за наследственными членами - PullRequest
1 голос
/ 17 ноября 2009

У меня есть пара небольших классов для представления частей в поисковом фильтре. Если искомое значение равно NonValue, фильтр должен ничего не делать. Это определено в базовом классе:

    Private Class BaseFilter
        Protected NonValue As Object
        Protected sQueryStringBase As String = "AND {0} {1} {2} "

        Public Sub CheckNonValue(ByVal QueryItem As Object)
            'No Query if Item not valid
            If Me.NonValue.Equals(Me.QueryItem) Then
                Me.sQueryStringBase = String.Empty
            End If
        End Sub

    End Class

BaseFilter затем расширяется для различных типов полей:

    Private Class StringFilter
        Inherits BaseFilter
        Protected Shadows NonValue As String = String.Empty
    End Class

Когда я создаю StringFilter и проверяю допустимое значение:

Dim stf As New StringFilter()
stf.CheckNonValue(MyString)

Я получаю исключение NullReferenceException (NonValue = Nothing), когда ожидал, что объектом NonValue будет String.Empty. Это ошибка в моем коде, или я пытаюсь достичь полиморфизма неправильно? Спасибо.

Ответы [ 3 ]

1 голос
/ 17 ноября 2009

Я думаю, что то, чего вы пытаетесь достичь, можно сделать, сделав NonValue Overridable в BaseFilter, затем в вашем производном классе ...

Private Class StringFilter
   Inherits BaseFilter
   Protected Overrides NonValue As String = String.Empty
End Class

EDIT:

Как вы правильно заметили, вы не можете переопределить переменную-член. Кроме того, вы не можете переопределить один тип другим; поэтому даже если бы вы изменили свои переменные-члены на свойства, мое первоначальное предложение (выше) не сработало бы. Чтобы искупить мои грехи :) Я собрал другое предложение, используя дженерики:

Public MustInherit Class Filter(Of T)

    Protected NullValue As T
    Protected QueryStringBase As String = "AND {0} {1} {2} "

    Public Sub CheckNonValue(ByVal value As T)
        If NullValue.Equals(value) Then
            Me.QueryStringBase = String.Empty
        End If
    End Sub

End Class

Public Class StringFilter
    Inherits Filter(Of String)
    Public Sub New()
        NullValue = String.Empty
    End Sub
End Class

Public Class ObjectFilter
    Inherits Filter(Of Object)
    Public Sub New()
        NullValue = Nothing
    End Sub
End Class
0 голосов
/ 17 ноября 2009

Затенение - это противоположность того, что вы хотите ... Затенение в Visual Basic позволит двум переменным называть одну и ту же вещь, но не ссылаться на один и тот же объект (то есть подпись одна и та же, но это означает разные вещи).

Это происходит автоматически, например, когда у вас есть локально определенная переменная foo и переменная уровня класса foo. Любые вызовы foo в локальной области видимости будут обращаться к локальной переменной, а вне области - к переменной уровня класса.

0 голосов
/ 17 ноября 2009

позволяет подклассу передавать объект NonValue в его базу через конструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...