0

现在我希望以下是可能的,虽然我不完全确定它是这样的......

下面是我希望的设置(在 VB.net 中,请随意用 C# 回答,我应该能够解决):

Public Class A

    Private _name As String
    Private _s As SearchA

    Public Property Name() As String
         Get
            Return _name
         End Get
         Set(ByVal Value As String)
            _name = Value
         End Set
    End Property
    Public Property S() As SearchA
         Get
            Return _s
         End Get
         Set(ByVal Value As SearchA)
            _s = Value
         End Set
    End Property

    Public Sub New(ByVal name As String)
         _name = name 
         _s = New SearchA()
    End Sub

    Public Function GetSearch() As String
         Return _s.Search
    End Sub

End Class

Public Class SearchA

    Private _search As String

    Public Property Search () As String
         Get
            Return _search 
         End Get
         Set(ByVal Value As String
            _search = Value
         End Set
    End Property

    Public Sub New()
         _search = "Search using Base"
    End Sub
End Class

Public Class B
    Inherits A

    Private Shadows _s As SearchB

    Public Shadows Property S() As SearchB
         Get
            Return _s
         End Get
         Set(ByVal Value As SearchB)
            _s = Value
         End Set
    End Property

    Public Sub New(ByVal name As String)
         Mybase.New(name)
         _s = New SearchB()
    End Sub

End Class

最后

Public Class SearchB
    Inherits SearchA

    Private _superSearch As String

    Public Property SuperSearch  () As String
         Get
            Return _superSearch 
         End Get
         Set(ByVal Value As String
            _superSearch = Value
         End Set
    End Property

    Public Sub New()
        Mybase.New()
         _search = "Search using New"
         _superSearch = "With more options..."
    End Sub

End Class

这是用法:

Dim oB As New B("hello")
Response.Write(oB.GetSearch())

我认为阴影可能会起作用并打印“使用新搜索”,但它没有,有什么想法吗?我无法覆盖,因为该属性具有与基类属性不同的返回类型。我想在基类中定义一组核心函数,我不必在每个子类中重写。或者这没有多大意义?

谢谢你的帮助!

史蒂夫

4

2 回答 2

0

我认为您要做的是定义一个由 SearchA 和 SearchB 继承的抽象 Search 类。使 _s 成为受保护的 Search 类型,将其公开为公共属性,并在 A 类中将 SearchA 分配给它,在 B 类中将 SearchB 分配给它。然后 GetSearch() 将返回来自 A 的 SearchA 和来自 B 的 SearchB,尽管它们都将被键入作为搜索。

于 2009-04-15T18:50:50.387 回答
0

我认为是因为GetSearch是在A中实现的,所以它使用了A中的字段。

一般来说,如果你在遗留代码中没有使用阴影,你应该问问自己你做错了什么。

因为它在这里,这种设计有一种气味。从 A 继承 B 和从 SearchA 继承 SearchB 这两种情况都是滥用继承。这有点像从狗那里继承猫,因为它“基本相同”。正如 Jamie Ide 已经说过的:你应该使用抽象基类。

考虑:

  • 使用抽象基类并继承 A 和 B
  • 使用由基类引用的 SearchA 和 SearchB 实现的接口 ISearch。这是一种经典的策略模式。
  • 如果您需要对 SearchA 或 SearchB 的类型化引用,请使用泛型。你可能不需要它。
  • 使用工厂把东西放在一起
于 2009-04-16T11:46:35.447 回答