2010-01-25 4 views
1

Lors de la conception de mon logiciel, j'ai commencé avec des interfaces, car cela semble être la «norme». Puis je suis passé aux classes abstraites parce qu'elles semblent mieux adaptées au problème actuel. Cependant je ne suis pas sûr si j'ai manqué quelques considérations en faisant ce choix de conception. En dehors des problèmes spécifiques au domaine, j'ai réfléchi à quels sont les facteurs les plus généraux à prendre en compte lors du choix entre les interfaces et les classes de résumé.Quels sont les facteurs à prendre en compte lors du choix entre les interfaces et les classes abstraites?

+0

Dupliquer plusieurs fois: http://stackoverflow.com/questions/376642/inheritance-design-using-interface-abstract-class-good-practice et d'autres – cletus

Répondre

2

Je trouve que la meilleure option est de faire les deux. Ce n'est pas toujours possible quand vous comptez sur quelque chose qui se passe dans la classe de base. Fournir à la fois une classe de base abstraite et une interface permet la plus grande latitude par les exécutants de votre abstraction, encore une fois, tant que vous n'avez pas besoin de quelque chose qui se passe par un implémenteur de l'interface. Si vous besoin que quelque chose se passe, alors vous ne pas veulent fournir une interface du tout - et vous devez également vous assurer que votre classe de base assure cette nécessaire action pour produire TOUJOURS ...

Négatif à faire les deux: plus de goo.

exemple pseudocode:

interface IVehicle 
{ 
    void PutCarInGear(Int speed); 
} 

abstract class Vehicle : IVehicle 
{ 
    public void PutCarInGear(Int speed) 
    { 
     //base implementation 
    } 
} 

Notez que dans cet exemple, quelqu'un pourrait faire leur propre classe qui implémente IVehicle et passer ensuite à tout ce qui prend un IVehicle. Cet objet n'aurait pas besoin d'être un enfant de la classe abstraite Vehicle. Si, par conséquent, vous deviez vous attendre à ce que quelque chose de spécifique se produise dans la méthode PutCarInGear(), il est fort probable que cette nouvelle classe ne répondrait PAS à cette attente. Cependant, tant que les implémentations de IVehicle n'ont pas d'importance, alors c'est l'abstraction la plus flexible d'avoir à la fois une classe de base abstraite ET une interface.

2

L'héritage définit la similarité de la composition. Les interfaces définissent la similarité de comportement. De là, vous devez décider si la composition est suffisamment importante pour remplacer le comportement.

0

Si votre interface a également un comportement par défaut raisonnable pour au moins certaines fonctionnalités, vous pouvez utiliser une classe abstraite pour éviter le code standard dans toutes les implémentations concrètes. Sinon, utilisez une interface.

0

Utilisez une classe abstraite lorsque plusieurs instances réifient le modèle de méthode de modèle.

Disons que vous avez trois analyseurs. On supprime les données du fichier par ",", une autre par "", et une autre par "|"

Vous pouvez avoir un CommaParser, un SpaceParser et un PipeParser, tous les sous-classement Résumé Parser et redéfinissant la méthode abstraite, getDelimiter()

Utiliser une interface lorsque les classes ne partagent pas la mise en œuvre, mais simplement répondre la même méthode appelle.

0

Conservez-le en tant que classe abstraite s'il s'agit d'une relation «est un» et que vous devez effectuer le sous-ensemble/toutes les fonctionnalités. Gardez-le comme interface si c'est une relation «Devrait faire».

Questions connexes