2009-11-17 2 views
1

검색 필터에서 부품을 나타내는 몇 개의 작은 클래스가 있습니다. 검색된 값이 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 것으로 예상 할 때 얻을. 이것은 내 코드의 버그입니까, 아니면 잘못된 방식으로 다형성을 얻으려고합니까? 감사.

답변

0

하위 클래스가 생성자를 통해 NonValue 개체를 해당 기본 개체로 전달하도록합니다.

+0

이것이 내가 한 일이다. 하지만 기본 클래스는 여전히 메모리 주소를 확인하는 Object.Equals()를 사용하여 Equal()을 테스트하는 것처럼 보입니다. 따라서 하위 클래스의 CheckNonValue() 메서드를 재정의하고 테스트하기 전에 내 NonValue를 원하는 형식 인 CType(Me.NonValue, String)으로 캐스팅해야했습니다. – Jonas

0

음영은 원하는 것과 반대입니다. Visual Basic의 그림자는 두 변수의 이름이 같지만 동일한 객체를 참조하지 않도록합니다 (즉, 서명은 동일하지만 다른 의미를 가짐) .

로컬로 정의 된 변수가 foo이고 클래스 수준 변수가 foo 인 경우 자동으로 발생합니다. 지역 범위 내에서 foo를 호출하면 지역 변수에 액세스하고 범위 외부에서는 클래스 수준 변수에 액세스합니다. 당신이 바르게했듯이

:

+0

@Andrew : BaseFilter에서 상속하는 클래스가 더 많습니다. 아이디어는 상속 클래스에서 CheckNonValue 메서드를 다시 사용할 수 있어야한다는 아이디어가있었습니다. – Jonas

+0

예,하지만 저는 이것이 섀도 잉을 사용하여 달성 할 수 없다고 생각합니다. 당신은 세라가 추천하는 것과 같은 것을 사용하고 싶습니다. –

+0

당신은 쉐도 잉 (shadowing)에 관해서 어디에서 보았을까요? – Jonas

1

나는

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

편집 ... 당신이 당신의 파생 클래스에서 다음 BaseFilter에서 NonValue 재정의을 제작하여 수행 할 수 있습니다 달성하기 위해 무엇을하려고하는 생각 멤버 변수를 재정의 (override) 할 수 없다고 지적했다. 또한 한 유형을 다른 유형으로 대체 할 수 없습니다. 그래서 멤버 변수를 프로퍼티로 변경했다하더라도 위의 원래 제안은 효과가 없었을 것입니다. 내 죄를 속죄하기 위해서 : 나는 제네릭을 사용하여 또 다른 제안을했다 :

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

Overridable로 멤버를 설정할 수 없습니다 (적어도 .NET 2.0에서는 아닐 것입니다). – Jonas

+0

멤버 변수를 무시할 수 없다는 것은 사실입니다. 대부분의 경우 대신 속성을 사용하지만, 귀하의 경우에는 완전히 다른 솔루션을 제공하기 위해 원래의 답변을 편집해야했습니다. – JulianM

관련 문제