我有几个小类来代表搜索过滤器中的部分。如果搜索的值等于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)
。这是我的代码中的错误,还是我试图以错误的方式实现多态?感谢。
答案 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的任何调用都将访问局部变量,并且在范围之外它将访问类级变量。