2009-04-30 7 views
0

J'ai plusieurs classes qui appartiennent conceptuellement à un niveau. Ils n'ont pas de propriétés communes, c'est pourquoi ils n'ont pas besoin d'hériter d'une classe de base.Utilisation de la classe parente vide uniquement pour grouper d'autres classes. Est-ce qu'il y a une meilleure approche?

J'ai également quelques méthodes qui traitent de ces classes. Certains d'entre eux sont des modèles du style suivant:

public SomeClass 
{ 
    public void SomeMethod<T> (T argument) where T : BaseClass 
    { 
     /* Do something */ 
    } 
} 

Je suis en utilisant ce mot-clé WHERE juste pour obtenir le code (de moi-même, je suppose), de sorte que je ne par erreur d'alimentation à cette méthode quelque chose autre.

Naturellement j'ai fait ces autres classes dérivent de BaseClass qui est vide et n'a pas d'autre but (au moins pour l'instant) que de grouper d'autres classes.

Ce n'est probablement pas une bonne approche mais de toute façon je l'utilise.

Y a-t-il une meilleure façon de procéder?

EDIT: Après examen, j'ai décidé de ne pas suivre cette approche et j'ai juste supprimé cette classe de base. Assez bien sans. Je ne peux pas rendre le code absolument parfait de toute façon, et moins il y a de choses inutiles, mieux c'est.

Répondre

6

Utilisez un marqueur (vide) Interface au lieu d'une classe de base:

public void SomeMethod<T> (T argument) where T : ISomeInterface 
0

Peut-être un exemple plus concret fournirait un peu plus de recul. En l'état, je dirais que vous ne devriez pas grouper les classes de cette façon.

Votre méthode SomeMethod() ne fait évidemment référence à aucune des propriétés de l'argument (ou si c'est le cas, elle doit également convertir l'argument en différents types); Quelle est la raison pour sécuriser le code "de vous-même"? Que se passerait-il si vous appeliez la méthode passant dans un objet qui n'était pas approuvé?

Si la contrainte d'argument est absolument nécessaire, je recommanderais, comme Grybyx, d'utiliser une interface. Cela vous sauvera des problèmes avec l'héritage multiple.

2

+1 sur la réponse de Jeff. Les interfaces de marquage ("marker") sont communes dans les frameworks C# et Java. Ils vous permettent d'affecter un type commun à la "classe A" afin qu'une autre classe ("classe B") puisse ignorer le type concret de la classe A.

Comme avec tout ce flexible, il est facile d'abuser, mais dans votre cas, il remplit définitivement la facture.

Questions connexes