多态和阴影继承了成员

时间:2009-11-17 15:07:54

标签: vb.net inheritance polymorphism

我有几个小类来代表搜索过滤器中的部分。如果搜索的值等于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)

当我期望NonValue对象是String.Empty时,我得到一个NullReferenceException (NonValue = Nothing)。这是我的代码中的错误,还是我试图以错误的方式实现多态?感谢。

3 个答案:

答案 0 :(得分:1)

我认为您要实现的目标可以通过在BaseFilter中创建NonValue Overridable ,然后在派生类中完成...

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

编辑:

正如您正确指出的那样,您无法覆盖成员变量。此外,您不能用另一种类型覆盖一种类型;因此,即使您已将成员变量更改为属性,我的原始建议(上面)也不会有效。为了我的罪赎罪:)我已经使用泛型组合了另一个建议:

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

答案 1 :(得分:0)

让子类通过构造函数将NonValue对象传递给它的基础。

答案 2 :(得分:0)

阴影与你想要的相反...... Visual Basic中的阴影将允许两个变量被命名为相同的东西,但不能引用同一个对象(即签名是相同的,但它意味着不同的东西)。

这会自动发生,例如当您拥有本地定义的变量foo和类级别变量foo时。在本地范围内对foo的任何调用都将访问局部变量,并且在范围之外它将访问类级变量。