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?
Répondre
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.
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.
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.
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.
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».
- 1. .NET Le choix entre les structures et les classes
- 2. Quand utiliser les classes abstraites et quand utiliser les interfaces en C#
- 3. Quels sont les risques de sécurité potentiels typiques que les développeurs doivent prendre en compte?
- 4. comment organiser les interfaces et les classes
- 5. Utilisation des classes abstraites et interfaces
- 6. Quels sont les écarts constatés entre utf8_general_ci et utf8_unicode_ci?
- 7. Constructeurs dans les classes abstraites?
- 8. Sur les classes abstraites dans les annotations Java et Hibernate
- 9. Quels sont les changements nécessaires pour prendre en charge IPv6
- 10. Classes abstraites dans les relations GORM
- 11. Long sondage pour JSF - quels sont les choix?
- 12. Lors de la préparation d'un diagramme de Gantt, quelles sont les choses à prendre en compte?
- 13. Que dois-je prendre en compte lorsque les tests de performance DB2 sont lus et écrits?
- 14. FindBugs et CheckForNull sur les classes et les interfaces
- 15. interfaces pour les classes modèles
- 16. Que sont les interfaces et les délégués dans C#?
- 17. Agrégation UML lorsque les interfaces sont utilisées
- 18. facteurs à prendre en compte avant de déposer une colonne dans une table
- 19. Quels sont les facteurs les plus importants pour développer un jeu?
- 20. Quelles sont les différences entre Red5 et Flash Media Server
- 21. Quels sont les obstacles et les dangers lors de la migration de Visual SourceSafe vers SVN?
- 22. Quels sont les problèmes à prendre en compte lors de la mise à jour du contenu Flash 8 AS2 pour Flash 10
- 23. Utilisation des génériques dans les classes abstraites
- 24. DevExpress Reporting: Quels points techniques dois-je prendre en compte?
- 25. Quels sont les aspects de la conception d'application à prendre en compte lors du développement d'une application Web multi-niveaux et haute disponibilité?
- 26. Quels sont les problèmes avec les classes internes non statiques et la sérialisation en Java
- 27. Propriétés dans les classes abstraites Statics
- 28. Différences entre les interfaces Java et les protocoles Objective-C?
- 29. Différences entre les structures et les classes?
- 30. Problème avec le modèle de référentiel et les classes abstraites
Dupliquer plusieurs fois: http://stackoverflow.com/questions/376642/inheritance-design-using-interface-abstract-class-good-practice et d'autres – cletus