J'ai quelques questions pour vous, sages personnes, concernant la conception orientée objet avec des Interfaces et des classes abstraites. Considérez le scénario suivant :
J'ai une classe de base 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 classe de base abstraite implémente les méthodes et propriétés communes à tous les objets de données.
Ma question est, si la classe de base abstraite DataObjectBase implémente tout ce qui est spécifié dans l'interface IDataObject, l'interface doit-elle être déclarée dans la classe de base ou dans la classe(s) dérivée(s) ?
En C#, les interfaces déclarées dans la classe de base sont implicitement appliquées aux classes dérivées, mais est-ce la meilleure pratique ? Il me semble que implémenter l'interface dans la classe de base rend moins évident que la classe dérivée implémente l'interface, mais cela nécessite alors que l'interface soit spécifiée pour chaque classe dérivée.
De plus, si la classe de base n'était PAS abstraite, la recommandation changerait-elle ?
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 même nécessaire ? Le nom de la classe de base peut simplement être utilisé à la place du nom de l'interface, par exemple :
private DataObjectBase _dataObject;
private IDataObject _dataObject;
Dans l'exemple ci-dessus (où la classe de base implémente tout ce que l'interface expose), les deux peuvent être affectés aux mêmes types dérivés. Personnellement, j'utilise toujours l'interface dans ces situations, mais je suis intéressé par les opinions des gens.
Merci d'avance.