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

Я хочу знать, может ли класс наследовать от класса и интерфейса. Пример кода ниже не работает, но я думаю, что он передает то, что я хочу сделать. Причина, по которой я хочу это сделать, заключается в том, что в моей компании мы создаем устройство USB, последовательный порт, 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;
   }
}

Ответ 1

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

class USBDevice : GenericDevice, IOurDevice

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

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

Ответ 2

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

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

Ответ 3

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

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


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

public interface ITwo : IOne

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

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

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

Ответ 4

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