2009-09-23 8 views
1

Comment rendre la classe suivante aussi générale que possible (pour une réutilisation maximale) sans créer trop de classes du même type, bien qu'avec une propriété supplémentaire.C# Class Design avec des génériques

Je veux éviter d'écrire 3 versions légèrement différentes de la même classe

1 # classe avec No SubContent

public class Content 
    { 
     public string PageName { get; set; } 
    } 

2 # classe avec Subcontent

public class Content 
    { 
     public string PageName { get; set; } 

     public IList<Content> SubContent {get; set;} //same as class 

    } 

3 # classe avec sous-contenu d'un autre type

public class Content 
     { 
      public string PageName { get; set; } 

      public IList<DetailContent> SubContent {get; set;} //Note the different def 

     } 

Bien sûr, je peux créer une classe générique, mais je trouve cela déroutant pour les consommateurs. Il infère que la classe est de type T, alors qu'en fait son la propriété qui nécessite le type

public class Content<T> 
      { 
       public string PageName { get; set; } 

       public IList<T> SubContent {get; set;} //Note the different def 

      } 

Propriétés génériques ne sont pas pris en charge. Donc, y a-t-il des modèles ou des suggestions sur la façon dont je peux gérer ce problème?

Répondre

2

Qu'en est-

public class Content 
{ 
    public string PageName { get; set; } 
} 

public class ContentWithSubContent<T> : Content 
{ 
    public IList<T> SubContent { get; set; } 
} 

et si vous voulez être en mesure d'accéder SubContent ne sachant pas le type réel, vous pouvez utiliser

public class Content 
{ 
    public string PageName { get; set; } 
} 

public interface IContentWithSubContent 
{ 
    IEnumerable SubContent { get; } 
} 

public class ContentWithSubContent<T> : Content, IContentWithSubContent 
{ 
    public IList<T> SubContent { get; set; } 

    IEnumerable IContentWithSubContent SubContent 
    { 
     get { return this.SubContent; } 
    } 
} 

cette façon, vous peut accéder à la propriété SubContent en ignorant les génériques si nécessaire, en utilisant IContentsWithSubContent plutôt que Content.

+0

Bonne suggestion. –

3

Peut-être que vous pouvez jeter un oeil à la Composite Design Pattern

+0

Parfait! Je savais qu'il devait y avoir un modèle pour ce type de problème. mais ne pouvait pas penser au nom ou comment le google. Je ne peux que le décrire! –

1

Pourquoi ne pas faire une interface pour les classes de contenu:

public interface IContent { 
public function GetContent() 
} 

et vous pouvez utiliser List<IContent> dans votre classe de contenu?

vous pourriez même faire l'interface

générique
+0

Oui, je suggère même à IEnumerable au lieu de IEnumerable SubContent Property. Content lui-même pourrait être une liste contenant du contenu, aussi. – Beachwalker

3

ce qui est erroné avec:

public class Content<T> 
    { 
     public string PageName { get; set; } 

     public IList<T> SubContent { get; set; } //Note the different def 

    } 

? il vous fonctionne savez ...

+0

Bien sûr que oui, mais si je voulais créer une instance de Contenu sans un type ... i.e Il n'y a pas de SubContents. Je ne peux pas vraiment le faire sans créer de nouvelles classes pour supporter cela. –

+0

Pourquoi pas classe publique Contenu : Liste {...} // aucune propriété SubContent distincte. – Beachwalker

Questions connexes