В C # может ли класс наследовать от другого класса и интерфейса? - PullRequest
121 голосов
/ 13 января 2010

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

Ответы [ 4 ]

232 голосов
/ 13 января 2010

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

class USBDevice : GenericDevice, IOurDevice

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

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

20 голосов
/ 13 января 2010

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

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

19 голосов
/ 13 января 2010

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

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


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

public interface ITwo : IOne

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

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

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

1 голос
/ 13 января 2010

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

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