web-dev-qa-db-fra.com

C #: Les classes abstraites doivent implémenter des interfaces?

Mon code de test en C #:

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

Résultats dans l'erreur de compilation suivante:

error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'

Puisque la classe Test est un classe abstraite, pourquoi le compilateur l'exige-t-il pour implémenter l'interface? Cette exigence ne devrait-elle pas être uniquement obligatoire pour les cours concrets?

123
bguiz

En C #, une classe qui implémente une interface est obligatoire pour définir tous les membres de cette interface. Dans le cas d'une classe abstraite, vous définissez simplement ces membres avec le mot clé abstract:

interface IFoo
{
    void Bar();
}

abstract class Foo : IFoo
{
    public abstract void Bar();
}

Ou pour le dire autrement: vous n'avez pas devez "mettre en œuvre" it (ce qui constituerait une limite terrible pour les classes abstraites); cependant, en C #, vous devez dire au compilateur que vous passez délibérément le dollar à des sous-classes concrètes - et la ligne de code ci-dessus montre comment fais le.

Les commentaires et les commentaires défavorables se plaignant que ce n'est pas une réponse à la question manquent le point. Quelqu'un qui arrive à Stack Overflow, après avoir reçu cette erreur du compilateur, mais ayant une classe abstraite dans laquelle il serait erroné de fournir une implémentation, reste bloqué sans une bonne solution - devra écrire des méthodes d'implémentation qui jettent des exceptions d'exécution, un travail horrible -around - jusqu'à ce qu'ils aient les informations ci-dessus. Qu'il soit bon ou mauvais que C # exige cette explicité est en dehors du périmètre de Stack Overflow, et n'est pas pertinent pour la question ni pour cette réponse.

129
Joel

Contrairement à Java, en C #: "une classe abstraite doit fournir les implémentations de tous les membres des interfaces répertoriées dans la liste des classes de base de la classe. Toutefois, 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

10
00jt

Ils ne doivent pas réellement implémenter l'interface.
Les méthodes/propriétés d'interface peuvent être abstraites, voire virtuelles. Il appartient donc aux sous-classes de les implémenter réellement.

4
ntziolis