【问题标题】:Another OOP Question in Asp.netAsp.net 中的另一个 OOP 问题
【发布时间】:2010-10-19 16:21:14
【问题描述】:

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

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

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

感谢您的帮助!

史蒂夫

【问题讨论】:

  • 编辑:B 类的 S 属性中的集合应该是“Value As SearchB”
  • @stibstibstib:您可以编辑您的问题。这些 cmets 正上方有一个小小的“编辑”链接。
  • 啊,我明白了,这太小了!我现在就用它,谢谢。

标签: .net oop architecture inheritance overriding


【解决方案1】:

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

【讨论】:

  • 谢谢 Jamie,我确实认为这是唯一的选择,不幸的是,在我的情况下,我试图做的事情的原则毫无用处。
  • 你想做什么?从问题中并不清楚。如果你改写它,你可能会得到更多/更好的回应。
【解决方案2】:

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

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

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

考虑:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多