web-dev-qa-db-fra.com

En C #, une classe peut-elle hériter d'une autre classe et d'une interface?

Je veux savoir si une classe peut hériter d'une classe et d'une interface. L'exemple de code ci-dessous ne fonctionne pas, mais il indique ce que je veux faire. La raison pour laquelle je souhaite le faire est que, dans mon entreprise, nous fabriquons des périphériques USB, série, Ethernet, etc. J'essaie de développer un composant/interface générique que je peux utiliser pour écrire des programmes pour tous nos périphériques, ce qui aidera à garder les choses courantes (comme se connecter, se déconnecter, se procurer un micrologiciel) identiques pour toutes nos applications.

Pour ajouter à cette question: Si GenericDevice est dans un projet différent, puis-je insérer l'interface IOurDevices dans ce projet, puis faire en sorte que la classe USBDevice implémente l'interface si j'ajoute une référence au premier projet? Parce que j'aimerais simplement référencer un projet, puis implémenter différentes interfaces en fonction de l'appareil.

class GenericDevice
{
   private string _connectionState;
   public connectionState
   {
      get{return _connectionState; }
      set{ _connectionState = value;}
   }
}

interface IOurDevices
{
   void connectToDevice();
   void DisconnectDevice();
   void GetFirmwareVersion();
}

class USBDevice : IOurDevices : GenericDevice
{
   //here I would define the methods in the interface
   //like this...
   void connectToDevice()
   {
       connectionState = "connected";
   }
}

//so that in my main program I can do this...

class myProgram
{
   main()
   {
      USBDevice myUSB = new USBDevice();
      myUSB.ConnectToDevice;
   }
}
122
PICyourBrain

Oui. Essayer:

class USBDevice : GenericDevice, IOurDevice

Note: La classe de base doit précéder la liste des noms d'interface.

Bien entendu, vous devrez toujours implémenter tous les membres définis par les interfaces. Toutefois, si la classe de base contient un membre qui correspond à un membre d'interface, le membre de la classe de base peut fonctionner comme implémentation du membre d'interface et vous n'êtes pas obligé de l'implémenter à nouveau manuellement.

233
Mehrdad Afshari

Non, pas exactement. Mais il peut hériter d'une classe et implémenter une ou plusieurs interfaces.

Une terminologie claire est importante pour discuter de tels concepts. L’une des choses que vous verrez marquera l’écriture de Jon Skeet, par exemple, ici ou sur papier, c’est qu’il est toujours précis dans la façon dont il décrit les choses.

20
David M

Sans rapport avec la question (la réponse de Mehrdad devrait vous faire avancer), et j'espère que cela ne sera pas considéré comme une énigme: les classes ne le font pas héritent interfaces, elles implémentent = eux.

.NET ne supporte pas l'héritage multiple, donc garder les termes simples peut aider à la communication. Une classe peut hériter d'une seule classe et implémenter autant d'interfaces qu'elle le souhaite.


En réponse au commentaire d'Eric ... j'ai discuté avec un autre développeur de la question de savoir si les interfaces "héritent", "implémentent", "nécessite" ou "apportent" des interfaces avec une déclaration du type:

public interface ITwo : IOne

La réponse technique est que ITwo hérite de IOne pour plusieurs raisons:

  • Les interfaces jamais ont une implémentation, donc argumenter que ITwo implémenteIOne est totalement faux
  • ITwo hérite des méthodes IOne, si MethodOne() existe sur IOne, elle est également accessible à partir de ITwo. i.e: ((ITwo)someObject).MethodOne()) est valide, même si ITwo ne contient pas explicitement de définition pour MethodOne()
  • ... parce que le runtime le dit! typeof(IOne).IsAssignableFrom(typeof(ITwo)) renvoie true

Nous avons finalement convenu que les interfaces prennent en charge l'héritage vrai/complet. Les fonctionnalités d'héritage manquantes (telles que les remplacements, les accesseurs abstraits/virtuels, etc.) sont absentes des interfaces et non de l'héritage d'interface. Cela ne rend toujours pas le concept simple ou clair, mais cela aide à comprendre ce qui se passe réellement sous le capot dans le monde d'Eric :-)

19
STW

J'ai trouvé la réponse à la deuxième partie de mes questions. Oui, une classe peut implémenter une interface qui est dans une classe différente tant que l'interface est déclarée publique.

1
PICyourBrain