Asp.net中的另一个OOP问题

时间:2009-04-15 18:39:30

标签: .net oop architecture inheritance override

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

下面是我希望可能的设置(在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())

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

感谢您的帮助!

史蒂夫

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

通常,如果你在遗留代码中使用Shadows,你应该问问自己你做错了什么。

就像在这里一样,这种设计有气味。来自A的继承B和来自SearchA的SearchB的两种情况都是滥用继承。它继承了一只来自狗的猫,因为它“大部分都是一样的”。正如Jamie Ide已经说过:你应该使用抽象基类。

考虑:

  • 使用抽象基类并继承A和B
  • 使用SearchA和SearchB实现的接口ISearch 基类引用。这是一种经典的策略模式。
  • 如果您需要对SearchA或SearchB的类型引用,请使用泛型。您 可能不需要它。
  • 使用工厂将事物放在一起