В C#, может ли класс наследовать от другого класса и интерфейса?


Я хочу знать, может ли класс наследовать от класса и интерфейса. Пример кода ниже не работает, но я думаю, что он передает то, что я хочу сделать. Причина, по которой я хочу это сделать, заключается в том, что в моей компании мы делаем USB, serial, Ethernet и т. д. Устройство. Я пытаюсь разработать общий компонент / интерфейс, который я могу использовать для написания программ для всех наших устройств, которые помогут сохранить общие вещи (например, подключение, отключение, получение прошивки) одинаковыми для всех наших приложения.

чтобы добавить к этому вопросу: если GenericDevice находится в другом проекте, могу ли я поместить интерфейс IOurDevices в этот проект, а затем заставить класс USBDevice реализовать интерфейс, если я добавлю ссылку на первый проект? Потому что хотел бы просто ссылаться на один проект, а затем реализовать разные интерфейсы в зависимости от того, какой аппарат.

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

4 ответа:

да. Попробуйте:

class USBDevice : GenericDevice, IOurDevice

Примечание: базовый класс должен стоять перед списком имен интерфейсов.

конечно, вам все равно нужно будет реализовать все члены, которые определяют интерфейсы. Однако, если базовый класс содержит элемент, соответствующий элементу интерфейса, элемент базового класса может работать как реализация элемента интерфейса, и вам не нужно вручную реализовывать его снова.

нет, не совсем так. Но он может наследовать от класса и реализовать один или несколько интерфейсов.

четкая терминология важна при обсуждении таких понятий. Одна из вещей, которую вы увидите, например, в письме Джона Скита, как здесь, так и в печати, заключается в том, что он всегда точен в том, как он описывает вещи.

не связано с вопросом (ответ Mehrdad должен заставить вас идти), и я надеюсь, что это не воспринимается как придирчивый: классы не наследование интерфейсы, они реализовать них.

.NET не поддерживает множественное наследование, поэтому сохранение прямых терминов может помочь в общении. Класс может наследовать от одного суперкласса и может реализовать столько интерфейсов, сколько пожелает.


в ответ на замечание Эрика... У меня был обсуждение с другим разработчиком о том, являются ли интерфейсы "наследованием", "реализацией", "требованием" или "приведением" интерфейсов с объявлением типа:

public interface ITwo : IOne

технический ответ заключается в том, что ITwo не наследуют IOne по нескольким причинам:

  • интерфейсы никогда есть реализация, поэтому утверждаю, что ITwoосуществляетIOne плоско неправильно
  • ITwo наследует IOne методы, если на IOne тогда он также доступен из ITwo. я.е: ((ITwo)someObject).MethodOne()) действительно, хотя ITwo явно не содержит определения для MethodOne()
  • ...потому что так говорит среда выполнения! typeof(IOne).IsAssignableFrom(typeof(ITwo)) возвращает true

мы наконец-то договорились, что интерфейсы поддерживают истинное/полное наследование. Отсутствующие функции наследования (такие как переопределения, абстрактные/виртуальные методы доступа и т. д.) отсутствуют в интерфейсах, а не в интерфейсе наследование. Это все еще не делает концепцию простой или ясной, но это помогает понять, что на самом деле происходит под капотом в мире Эрика :-)

Я нашел ответ на вторую часть моего вопроса. Да, класс может реализовать интерфейс, который находится в другом классе, если интерфейс объявлен как общедоступный.