2009-04-15 6 views
0

jetzt habe ich die folgende bin der Hoffnung, ist möglich, obwohl ich nicht ganz sicher bin, es ist so hier geht ...Eine weitere OOP Frage in Asp.net

unten ist das Setup von dem, was ich hoffe, ist möglich (in VB.net, fühlen sie sich frei in C# zu beantworten und ich sollte es arbeiten können out):

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 

und

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 

und

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 

und schließlich

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 

und hier ist die Nutzung:

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

Ich dachte, dass Schatten funktionieren könnte und print „Suche Neuer mit“ aber es funktioniert nicht, irgendwelche Ideen? Ich kann nicht überschreiben, da die Eigenschaft einen anderen Rückgabetyp als die Basisklasseneigenschaft hat. Ich möchte innerhalb einer Basisklasse einen Kernsatz von Funktionen definieren, die ich innerhalb einer Kindklasse nicht überschreiben muss. Oder macht das nicht viel Sinn?

Danke für Ihre Hilfe!

Steve

+0

EDIT: Das Set in der S-Eigenschaft in der Klasse B 'Value Als SEARCHB' –

+0

@stibstibstib sagen sollte: Sie Ihre Frage bearbeiten kann. Über diesen Kommentaren befindet sich ein kleiner Link zum Bearbeiten. – Welbog

+0

ah Ich sehe, das ist ziemlich klein! Ich werde es jetzt benutzen, danke. –

Antwort

0

Ich denke, was Sie tun möchten, ist eine abstrakte Such Klasse zu definieren, die von SearchEin und SEARCHB vererbt wird. Machen Sie _s zu einem geschützten Suchtyp, legen Sie ihn als öffentliche Eigenschaft offen und weisen Sie ihm in Klasse A SearchA und in Klasse B SearchB zu. Dann liefert GetSearch() SearchA von A und SearchB von B zurück, obwohl beide typisiert werden als Suche.

+0

Danke Jamie, ich dachte, das ist die einzige Option, die leider in meinem Fall das Prinzip dessen, was ich versuchte, nutzlos macht. –

+0

Was versuchst du zu tun? Es war nicht klar aus der Frage. Wenn Sie es neu formulieren, erhalten Sie möglicherweise mehr/bessere Antworten. –

0

Ich denke, es liegt daran, dass GetSearch in A umgesetzt wird, so dass es verwendet die Felder von A.

Allgemeinen, wenn Sie Schatten nicht im Legacy-Code zu verwenden, sollten Sie sich fragen, was Sie falsch machen.

Wie es hier ist, hat dieses Design einen Geruch. Beide Fälle von Vererbung B von A und SearchB von SearchA sind eine Art von Vererbung. Es ist eine Art, eine Katze von einem Hund zu erben, weil es "meistens das Gleiche" ist. Wie Jamie Ide bereits sagte: Sie sollten abstrakte Basisklassen verwenden. Betrachten

zu:

  • eine abstrakte Basisklasse verwenden und erben A und B
  • Verwenden Sie eine Schnittstelle ISearch implementiert durch SearchEin und SEARCHB die Referenz durch die Basisklasse ist. Es ist ein klassisches Strategie-Muster.
  • Verwenden Sie Generika, wenn Sie eine getippte Verweise auf SearchA oder SearchB benötigen. Sie wahrscheinlich brauchen es nicht.
  • Verwendung Fabriken Dinge zusammen