Question

Je vois beaucoup de choses comme ça:

interface A { ... }
interface B : A { ... }
class C : B, A { ...}

Pourquoi voudriez-vous spécifier que C implémente l'interface A alors que B hérite déjà de A? Cela fait-il une différence sémantique ou est-ce juste une question de style?

(Un des nombreux exemples est List<T> mettant en œuvre IList<T> et ICollection<T>, tandis que B dérive également de C).

Mise à jour: Merci de confirmer mon hypothèse selon laquelle cela ne fait aucune différence sémantique.

Je suis arrivé à une situation connexe dans laquelle il fait faire une différence pour nommer explicitement une interface qui se trouve déjà dans l'arbre d'héritage:

Si A était une classe, : n'appliquerait (à nouveau) que des membres d'interface à partir de <=> si elle nomme <=> explicitement après le '<=>'.

[EDIT] J'ai modifié le libellé de la question pour éviter toute confusion avec les membres d'interface explicitement implémentés, qui limitent l'utilisation du membre aux cas où l'objet est transt comme interface.

Était-ce utile?

La solution

Je pense que c'est juste une question de style. Cela est particulièrement important lorsque vous examinez les classes framework / library - dans votre exemple, par exemple, cela met en évidence l'idée que cette classe peut être traitée comme un ICollection ou un IList, sans que le développeur ait besoin de savoir que IList est en fait un ICollection.

Il n’a pas de ramifications fonctionnelles. Plus précisément, ce code compilerait si la classe 'C' implémente 'A' explicitement:

namespace DotNetInterfaceTest {
    class Program {
        static void Main(string[] args) {
            A c = new C();
        }
    }

    interface A {
        void foo();
    }

    interface B : A {
        void bar();
    }

    class C : B {
        public void bar() {}
        public void foo() {}
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top