Disons que nous avons deux interfaces:
interface Ilayer1 : Ilayer2 { string testMethod1(); } interface Ilayer2 { string testMethod2(); } class A: Ilayer1 { ...//implement all methods of Ilayer 1 and Ilayer2 }
3 Réponses :
iLayer1 code> hérités iLayer2 code> afin que toute personne implémente iLayer1 code> devra mettre en œuvre testmethod1 () code> et strong> testmethod2 () code>. pourquoi strong> l'avez-vous? Pourquoi pas? Parce que nous pouvons? Je pense que dans de grands projets avec de nombreuses interfaces, il peut devenir assez fastidieux si vous devez spécifier toutes les interfaces que certaines classes implémentent séparément (bien que dans un bon S STRUT> OLID Design Une classe ne doit généralement pas implémenter plus de quelques interfaces de toute façon). Vous pouvez donc "grouper" des interfaces en les mettant en œuvre d'autres. Vous pouvez également "Version 'Une interface à l'aide de l'interface héritage . li>
- vous pouvez. C'est à vous. C'est bien d'avoir des choix. Utilisez Héritage ou implémentez les interfaces séparément. C'est à vous de décider. Li>
ol>
Les interfaces peuvent hériter d'autres interfaces. Une classe peut inclure une interface plusieurs fois à travers des classes de base qu'elle hérite ou via des interfaces que d'autres interfaces héritent. Toutefois, la classe peut fournir une implémentation d'une interface une seule fois et uniquement si la classe déclare l'interface dans le cadre de la définition de la classe ( Class NomName: interfacename code>). Si l'interface est héritée parce que vous avez hérité d'une classe de base qui implémente l'interface, la classe de base fournit la mise en œuvre des membres de l'interface. Cependant, la classe dérivée peut réimplémenter tous les membres d'interface virtuelle au lieu d'utiliser la mise en œuvre héritée. Source P>
blockQuote>
Un exemple de vie réelle:
interface IShape { double X { get; } double Y { get; } } interface IAreaShape : IShape { double GetArea(); } interface IPerimeterShape : IShape { double GetPerimeter(); }
C'est juste la même sémantique que l'héritage entre les classes.
Dans le monde OOP, un type dérivé héritant un type de base lorsqu'il s'agit d'une version plus spécifique du type de base - que ce type est une interface ou une classe, le principe reste le même. P>
Voici un exemple du .NET Framework: IList code>
hérite le Icollection interface qui hérite du Interface IEnumerable . P>
L'interface the Le donc un Le fait que les interfaces peuvent hériter les uns des autres signifie que vous pouvez avoir un Polymorphe point de vue également sur des interfaces et non seulement sur les classes - ce qui peut aider à simplifier votre code lors de la gestion de plusieurs interfaces héritantes. p>
Un avantage supplémentaire de cela est le fait que vous pouvez déclarer des méthodes d'extension sur une interface et l'utiliser sur n'importe quelle classe qui implémente cette interface, que ce soit directement ou indirectement en implémentant une interface qui le hérite - comme dans les classes. p>
En ce qui concerne la question de savoir pourquoi ne pas supprimer l'héritage et mettre en œuvre séparément les deux interfaces - qui auraient un sens si les interfaces n'étaient pas liées - comme, par exemple, dans le iEnumerable code> fournit la méthode
getenumerator () code> nécessaire pour énumérer à l'aide de la boucle
foreach code>. p>
icollection code> ajoute de nouvelles fonctionnalités: la propriété
comptez code> et le
copyto code> méthode. p>
IList code> ajoute encore plus de capacités - l'indexer, le
Ajouter code> et
supprimer des méthodes code> et ainsi de suite. P>
IList code> est un type plus spécifique d'un
icollection code>, qui est un type plus spécifique d'un
ienumerable code>. p>.
Contrôle code>
classe (dans le système. Windows.Forms) - Il implémente de nombreuses interfaces, telles que idroptarget code> et
icomponent code> non liée. P>
Iprimate: Imammal: Ivertèbre Code> Par exemple. Chacun de ces caractéristiques ajoutez des caractéristiques spécifiques à ce qu'elle hérite que d'autres personnes ne puissent pas. Par exemple, vous pouvez également avoir
ifish: ivertèdre code> puisque les poissons et les mammifères ont des propriétés distinctes distinctes.
Donc, vous êtes d'accord avec une duplication encore et encore
iLayer2 code> dans chaque implémenteur de
iLayer1 code>?
Si
iLayer1 code> ajoute la fonctionnalité à
iLayer2 code> ou
iLayer2 code> est quelque chose que
iLayer1 code> utilise également (comme
Icomarable code>) alors il est parfaitement logique. Les exemples du monde réel le rendraient plus évidents.