141 votes

En c#, une classe peut hériter d’une autre classe et une interface ?

Je veux savoir si une classe peut hériter d'une classe et et de l'interface. L'exemple de code ci-dessous ne fonctionne pas, mais je pense qu'il transmet ce que je veux faire. Quelqu'un aurait-il des recommandations??? La raison pour laquelle je veux faire, c'est parce que dans mon entreprise nous faire USB, série, Ethernet, etc périphérique. Je suis en train de développer un composant générique/interface que je peux utiliser pour écrire des programmes pour tous nos appareils qui aidera à garder les choses communes (comme une connexion, la déconnexion, l'obtention de firmware), le même pour toutes nos applications... Toutes les suggestions sont les appriciated!

Pour Ajouter à cette question: Si GenericDevice est en projet différent, je peux mettre le IOurDevices interface dans ce projet, puis ensuite faire la USBDevice classe implémente l'interface si-je ajouter une référence à la première projet?? Parce que voudrais juste référence à un projet, puis de mettre en œuvre des interfaces différentes selon ce que l'appareil est...

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;
   }
}

263voto

Mehrdad Afshari Points 204872

Oui. Essayez :

Remarque : La classe de base doit venir avant la liste des noms d’interfaces.

Bien sûr, vous devrez toujours implémenter tous les membres qui définissent les interfaces. Toutefois, si la classe de base contient un membre qui correspond à un membre d’interface, le membre de classe de base peut fonctionner comme l’implémentation du membre d’interface, et vous ne doivent pas implémenter manuellement à nouveau.

22voto

David M Points 45808

Non, pas exactement. Mais elle peut hériter d’une classe et mettre en œuvre une ou plusieurs interfaces.

Terminologie claire est importante lors de la discussion des concepts comme cela. Une des choses que vous verrez marquer Jon Skeet écrit, par exemple, ici et dans la presse, est qu’il est toujours précis dans la façon dont choses décrit he.

21voto

STW Points 15326

Aucun rapport avec la question (Mehrdad la réponse devrait arriver), et j'espère que ce n'est pas pris comme pinailleurs: classes ne pas hériter des interfaces, ils mettre en œuvre .

.NET ne prend pas en charge le multi-héritage, afin de maintenir les conditions de droit peut aider dans la communication. Une classe ne peut hériter que d'une seule super-classe et peut mettre en œuvre autant d'interfaces qu'il le souhaite.


En réponse à Eric commentaire... j'ai eu une discussion avec un autre développeur pour savoir si oui ou non les interfaces "hériter", "mettre en œuvre", "demander" ou "apporter le long" des interfaces avec une déclaration comme:

public interface ITwo : IOne

La réponse technique est qu' ITwo n'héritent IOne , pour plusieurs raisons:

  • Interfaces jamais mise en œuvre, de sorte arguant qu' ITwo implémente IOne est totalement faux
  • ITwo hérite IOne méthodes, si MethodOne() existe sur IOne , alors il est également accessible à partir d' ITwo. j'.e: ((ITwo)someObject).MethodOne()) est valable, même si ITwo ne contiennent pas explicitement une définition de l' MethodOne()
  • ...parce que le runtime dit! typeof(IOne).IsAssignableFrom(typeof(ITwo)) retours true

Nous avons finalement convenu que les interfaces vrai/full héritage. Le manque de succession (comme les remplacements, abstrait/virtuel accesseurs, etc) sont manquantes à partir des interfaces, et non pas à partir de l'héritage de l'interface. Ce n'est toutefois pas le concept simple ou claire, mais elle permet de comprendre ce qui se passe vraiment sous le capot, Eric du monde :-)

1voto

PICyourBrain Points 2487

J’ai trouvé la réponse à la deuxième partie de mes questions. Oui, une classe peut implémenter une interface dans une classe différente aussi longtemps que l’interface est déclaré comme public.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X