Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net中的另一个OOP问题_.net_Oop_Architecture_Inheritance_Overriding - Fatal编程技术网

Asp.net中的另一个OOP问题

Asp.net中的另一个OOP问题,.net,oop,architecture,inheritance,overriding,.net,Oop,Architecture,Inheritance,Overriding,现在,我希望以下是可能的,虽然我不完全确定它是这样的,就这样吧 下面是我希望能够实现的设置(在VB.net中,请随意用C#回答,我应该能够解决): 及 及 最后 Public Class SearchB Inherits SearchA Private _superSearch As String Public Property SuperSearch () As String Get Return _superSearch

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

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

最后

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())
我认为阴影可能会工作并打印“使用新搜索”,但它不会,有什么想法吗?我无法覆盖,因为该属性已被覆盖 基类属性的不同返回类型。我想在基类中定义一组我没有的核心函数 在每个子类中重写。或者这没有多大意义

谢谢你的帮助


Steve

我认为您要做的是定义一个由SearchA和SearchB继承的抽象搜索类。将“U”设为受保护的搜索类型,将其公开为公共属性,并在类a中将SearchA分配给它,在类B中将SearchB分配给它。然后GetSearch()将从a返回SearchA,从B返回SearchB,尽管它们都将被类型化为搜索。

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

通常,如果您在遗留代码中没有使用阴影,您应该问问自己哪里做错了

因为它在这里,这个设计有一种气味。从A继承B和从SearchA继承SearchB都是一种滥用继承。这有点像是从狗那里继承了一只猫,因为它“基本上是一样的”。正如JamieIDE已经说过的:应该使用抽象基类

考虑:

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

EDIT:B类中S属性中的集合应为'Value As SearchB'@stibstibstib:您可以编辑您的问题。在这些评论上面有一个小小的“编辑”链接。啊,我明白了,那太小了!我现在就用它,谢谢。谢谢杰米,我确实认为这是唯一的选择,不幸的是,在我的情况下,这使得我试图做的事情的原则毫无用处。你想做什么?这个问题不清楚。如果你重新措辞,你可能会得到更多/更好的回答。
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())