Mon code de test en C #:
namespace DSnA
{
public abstract class Test : IComparable
{
}
}
Résultats dans l'erreur de compilateur suivante:
error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'
Puisque la classe Test
est une classe abstraite , pourquoi le compilateur en a-t-il besoin pour implémenter l'interface? Cette exigence ne devrait-elle pas être obligatoire uniquement pour les cours concrets?
c#
syntax
interface
abstract-class
bguiz
la source
la source
Réponses:
En C #, une classe qui implémente une interface est requise pour définir tous les membres de cette interface. Dans le cas d'une classe abstraite, vous définissez simplement ces membres avec le
abstract
mot - clé:Ou pour le dire autrement: vous n'avez pas à "l'implémenter" (ce qui serait une terrible limitation des classes abstraites); cependant, en C #, vous devez dire au compilateur que vous passez délibérément la responsabilité à des sous-classes concrètes - et la ligne de code ci-dessus montre comment faire.
Les commentaires et les votes négatifs se plaignant que ce n'est pas une réponse à la question manquent le point. Quelqu'un venant à Stack Overflow, ayant reçu cette erreur de compilation, mais ayant une classe abstraite dans laquelle ce serait une erreur de fournir une implémentation, est bloqué sans une bonne solution - devrait écrire des méthodes d'implémentation qui ont jeté des exceptions d'exécution, un travail horrible - autour - jusqu'à ce qu'ils aient les informations ci-dessus. Que ce soit bon ou mauvais que C # nécessite cette explication est en dehors de la portée de Stack Overflow, et n'est pas pertinent pour la question ni cette réponse.
la source
Foo
lapublic abstract void IFoo.Bar();
et vous obtenez des plaintes que « public » et « abstrait » ne sont pas modificateurs valides.Contrairement à Java, en C #: "une classe abstraite doit fournir des implémentations de tous les membres des interfaces qui sont répertoriés dans la liste des classes de base de la classe. Cependant, une classe abstraite est autorisée à mapper des méthodes d'interface sur des méthodes abstraites."
https://msdn.microsoft.com/en-us/library/Aa664595(v=VS.71).aspx
la source
Ils n'ont pas à implémenter réellement l'interface .
Les méthodes / propriétés d'interface peuvent être abstraites ou même virtuelles. C'est donc aux sous-classes de les implémenter.
la source