1
votes

La différence entre les classes abstraites et les interfaces dans la version C # 8?

Une option a été ajoutée à la version 8 de C #. À ce stade, quelle sera la différence entre les classes abstraites et les interfaces et pourquoi utiliserais-je plus une classe abstraite? Quel serait l’avantage de ce changement dans cette version?


5 commentaires

C'est exactement pourquoi je n'aime pas cette fonctionnalité. Ce ne sont pas des implémentations dans le même sens que des implémentations «régulières» - ce sont des implémentations par défaut . Ils ont un but particulier: vous pouvez les ajouter à une interface existante et ainsi ajouter des fonctionnalités sans casser le code hérité. C'est déroutant et cela encourage le codage sale. Moi pas comme :(


Je ne pense pas que c’est du code sale, nous l’avions auparavant dans les versions précédentes dans des classes abstraites, donc c’est utile mais ma question est de savoir quel est l’avantage de cette nouvelle fonctionnalité?


Je n'ai pas dit que était sale. J'ai dit que cela encourage le codage sale. Pour être précis: en facilitant ce qui devrait être difficile à faire. J'ai déjà expliqué à quoi sert cette fonctionnalité. Si vous voulez aller plus loin dans ce terrier de lapin et trouver des applications plus valides: devblogs. microsoft.com/dotnet/… , docs.microsoft.com/en-us/dotnet/csharp/tutorials/… , docs.microsoft.com/en-us/dotnet/csharp/tutorials/...


La principale différence est que les classes abstraites peuvent avoir l'état et les interfaces ne peuvent pas.


Duplication de stackoverflow.com/questions/47601419/...


3 Réponses :


2
votes

Une classe peut étendre plusieurs interfaces mais une seule classe abstraite. Une interface ne peut pas avoir de constructeur et de destructeur mais une classe abstraite le peut.


0 commentaires

3
votes

La caractéristique fondamentale des interfaces est toujours qu'elles ne peuvent pas contenir de champs. Si vous avez besoin de données, vous avez besoin d'une classe de base. Sinon, une interface suffira probablement.


0 commentaires

3
votes

C # 8.0 introduit une nouvelle fonctionnalité appelée Implémentations par défaut dans les interfaces et cela change beaucoup de choses.

Les interfaces peuvent désormais avoir l'implémentation par défaut des méthodes. Les interfaces peuvent désormais avoir des membres privés. Les interfaces peuvent désormais avoir des membres statiques, ceci est utilisé pour le paramétrage de l'implémentation par défaut. Les interfaces peuvent désormais avoir des membres protégés qui ne sont pas accessibles par la classe dérivée mais qui peuvent être accessibles avec une interface dérivée. Si une classe veut implémenter le membre protégé, cela doit être fait en implémentant l'interface explicitement. Les interfaces peuvent également avoir des membres virtuels, mais la classe ne peut pas remplacer la méthode mais une interface le peut.

Nous pouvons penser que les interfaces et l'abstrait sont un peu les mêmes maintenant, mais une interface ne peut pas avoir un état d'instance, des champs d'instance, des propriétés automatiques d'instance, ne peut pas définir des champs ou des variables au niveau de la classe alors qu'une classe abstraite peut avoir un état.

Plusieurs raisons expliquent ce changement: extension des API, interopérabilité avec Android, iOS et prise en charge de la fonctionnalité de langage des traits.


0 commentaires