2009-04-15 6 views
0

maintenant j'espère que le suivant est possible, bien que je ne suis pas tout à fait certain si elle est ici va ...Une autre question OOP dans Asp.net

est inférieure à la configuration de ce que je suis l'espoir est possible (en VB.net, ne hésitez pas à répondre en C# et je devrais être en mesure de travailler dehors):

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 

et

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 

et

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 

et enfin

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 

et voici l'utilisation:

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

Je pensais que les ombres pourraient travailler et imprimer « Recherche à l'aide Nouveau », mais il n'a pas, des idées? Je ne peux pas redéfinir car la propriété a un type de retour différent à la propriété de classe de base. Je veux définir dans une classe de base un ensemble de fonctions de base que je n'ai pas pour remplacer dans chaque classe enfant. Ou cela n'a-t-il pas beaucoup de sens?

Merci pour votre aide!

Steve

+0

EDIT: L'ensemble de la propriété S dans la classe B devrait dire « Valeur Comme SEARCHB » –

+0

@stibstibstib: vous pouvez modifier votre question. Il y a un petit lien "edit" juste au-dessus de ces commentaires. – Welbog

+0

ah je vois, c'est plutôt petit! Je vais l'utiliser maintenant, merci. –

Répondre

0

Je pense que ce que vous voulez faire est de définir une classe abstraite de recherche qui est héritée par SEARCHà et SEARCHB. Faites de _s un type de recherche protégé, l'exposez en tant que propriété publique et lui assignez SearchA dans la classe A et SearchB dans la classe B. GetSearch() retournera SearchA de A et SearchB de B, bien qu'ils soient tous les deux tapés comme Recherche.

+0

Merci Jamie, je pensais que c'était la seule option qui malheureusement dans mon cas rend le principe de ce que j'essayais de rendre inutile. –

+0

Qu'essayez-vous de faire? Ce n'était pas clair à partir de la question. Si vous le reformulez, vous obtiendrez peut-être plus de réponses. –

0

Je pense qu'il est parce que GetSearch est mise en œuvre, de sorte qu'il utilise les champs de A.

En général, si vous utilisez Ombres pas dans le code existant, vous devez vous demander ce que vous faites mal.

Comme c'est ici, ce design a une odeur. Les deux cas d'héritage B de A et SearchB de SearchA sont une sorte d'héritage abusif. C'est un peu l'héritage d'un chat d'un chien parce que c'est "la même chose". Comme l'a déjà dit Jamie Ide: vous devriez utiliser des classes de base abstraites.

CONSIDÉRÉ COMME:

  • utiliser une classe abstraite et hériteront A et B
  • Utiliser une interface ISearch mis en œuvre par SEARCHà et SEARCHB qui est référence par la classe de base. C'est un schéma de stratégie classique.
  • Utilisez des génériques si vous avez besoin d'une référence typée à SearchA ou SearchB. Vous n'en avez probablement pas besoin.
  • usines d'utiliser pour mettre les choses ensemble