J'ai quelques questions pour vous les personnes sages impliquant la conception OO avec Interfaces et classes de base abstraites. Considérez le scénario suivant:Orientation de l'objet - Où placer cette déclaration de l'interface
J'ai une classe de basse abstraite "DataObjectBase" et une classe dérivée "UserDataObject". J'ai aussi une interface "IDataObject". L'interface expose bien sûr toutes les méthodes et propriétés publiques que mes objets de données doivent exposer, et vous pouvez probablement deviner que la base abstraite implémente les méthodes et propriétés communes à tous les objets de données. Ma question est la suivante: si la classe de basse abstraite DataObjectBase implémente tout ce qui est spécifié dans l'interface IDataObject, l'interface devrait-elle être déclarée sur la classe de base ou sur les classes dérivées?
En C#, les interfaces déclarées sur la classe de base implicitement sont appliquées aux classes dérivées, mais est-ce la meilleure pratique? Il me semble que l'implémentation de l'interface sur la classe de base rend moins évident que la classe dérivée implémente l'interface, mais exige à nouveau que l'interface soit spécifiée pour chaque classe dérivée.
En outre, si la classe de base n'était pas abstraite, la recommandation serait-elle modifiée?
Une deuxième sous-question: Si la classe de base implémente toutes les méthodes/propriétés de l'interface IDataObject, l'interface est-elle nécessaire? Le nom de type de la classe de base peut simplement être utilisé à la place du nom de l'interface, à savoir:
private DataObjectBase _dataObject;
private IDataObject _dataObject;
Dans l'exemple ci-dessus (où la base implémente tout ce qui est exposé par l'interface), les deux types dérivés peuvent être affectés. Personnellement, j'utilise toujours l'interface dans ces situations, mais je suis intéressé à entendre les pensées des gens.
Merci d'avance.