0
votes

Interface Héritage VS Classe Implémentation Deux interfaces

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 commentaires

Iprimate: Imammal: Ivertèbre 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 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 dans chaque implémenteur de iLayer1 ?


Si iLayer1 ajoute la fonctionnalité à iLayer2 ou iLayer2 est quelque chose que iLayer1 utilise également (comme Icomarable ) alors il est parfaitement logique. Les exemples du monde réel le rendraient plus évidents.


3 Réponses :


0
votes
  1. iLayer1 hérités iLayer2 afin que toute personne implémente iLayer1 devra mettre en œuvre testmethod1 () et testmethod2 () . pourquoi 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 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 .
  2. 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.

    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 ). 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


0 commentaires

1
votes

Un exemple de vie réelle:

interface IShape 
{
    double X { get; }
    double Y { get; }
}

interface IAreaShape : IShape
{
    double GetArea();
}

interface IPerimeterShape : IShape
{
    double GetPerimeter();
}


0 commentaires

3
votes

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.

Voici un exemple du .NET Framework: IList hérite le Icollection interface qui hérite du Interface IEnumerable .

L'interface iEnumerable fournit la méthode getenumerator () nécessaire pour énumérer à l'aide de la boucle foreach .

the icollection ajoute de nouvelles fonctionnalités: la propriété comptez et le copyto méthode.

Le IList ajoute encore plus de capacités - l'indexer, le Ajouter et supprimer des méthodes et ainsi de suite.

donc un IList est un type plus spécifique d'un icollection , qui est un type plus spécifique d'un ienumerable . .

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.

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.

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 Contrôle classe (dans le système. Windows.Forms) - Il implémente de nombreuses interfaces, telles que idroptarget et icomponent non liée.


0 commentaires