Еще один вопрос ООП в Asp.net - PullRequest
0 голосов
/ 15 апреля 2009

теперь я надеюсь, что возможно следующее, хотя я не совсем уверен, что это так ...

Ниже приведена настройка того, что, я надеюсь, возможно (в 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())

Я думал, что тени могут работать и печатать «Поиск с использованием нового», но это не так, есть идеи? Я не могу переопределить, поскольку свойство имеет другой тип возврата для свойства базового класса. Я хочу определить в базовом классе базовый набор функций, которых у меня нет переопределить в каждом дочернем классе. Или это не имеет особого смысла?

Спасибо за вашу помощь!

Steve

Ответы [ 2 ]

0 голосов
/ 16 апреля 2009

Я думаю, это потому, что GetSearch реализован в A, поэтому он использует поля из A.

Как правило, если вы используете Shadows не в устаревшем коде, вы должны спросить себя, что вы делаете неправильно.

Как и здесь, этот дизайн имеет запах. Оба случая наследования B от A и SearchB от SearchA являются своего рода неправильным наследованием. Это своего рода наследование кошки от собаки, потому что это «в основном то же самое». Как уже сказал Джейми Ид: вы должны использовать абстрактные базовые классы.

Рассмотрим:

  • используйте абстрактный базовый класс и наследуйте A и B
  • Использовать интерфейс ISearch, реализованный SearchA и SearchB, который ссылка по базовому классу. Это классическая стратегия.
  • Используйте дженерики, если вам нужны печатные ссылки на SearchA или SearchB. Вы вероятно, это не нужно.
  • использовать фабрики, чтобы соединить вещи
0 голосов
/ 15 апреля 2009

Я думаю, что вы хотите сделать, это определить абстрактный класс поиска, который наследуется SearchA и SearchB. Сделайте _с защищенным типом поиска, представьте его как открытое свойство и назначьте ему SearchA в классе A и ему SearchB в классе B. Затем GetSearch () вернет SearchA из A и SearchB из B, хотя оба они будут напечатаны как поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...