Я хочу знать, может ли класс наследовать от класса и интерфейса. Приведенный ниже пример кода не работает, но я думаю, что он передает то, что я хочу сделать. Причина, по которой я хочу это сделать, заключается в том, что в моей компании мы производим устройства 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;
}
}
источник
Ответы:
Да. Пытаться:
Примечание . Базовый класс должен стоять перед списком имен интерфейсов.
Конечно, вам все равно нужно будет реализовать все члены, определяемые интерфейсами. Однако, если базовый класс содержит член, который соответствует члену интерфейса, член базового класса может работать как реализация члена интерфейса, и вам не нужно вручную реализовывать его снова.
источник
USBDevice : IOurDevice
. Явное добавление реализации не влияет на базовый класс, но может помочь сделать акцент на интерфейсе.Нет, не совсем так. Но он может наследовать от класса и реализовывать один или несколько интерфейсов.
При обсуждении подобных понятий важна четкая терминология. Одна из особенностей письма Джона Скита, например, здесь и в печати, заключается в том, что он всегда точно описывает вещи.
источник
Не имеет отношения к вопросу (ответ Мердада должен вас заинтересовать), и я надеюсь, что это не будет воспринято как мелочь: классы не наследуют интерфейсы, они их реализуют .
.NET не поддерживает множественное наследование, поэтому ясность терминов может помочь в общении. Класс может наследовать от одного суперкласса и может реализовывать столько интерфейсов, сколько пожелает.
В ответ на комментарий Эрика ... У меня было обсуждение с другим разработчиком о том, «наследуют» ли интерфейсы, «реализуют», «требуют» или «переносят» интерфейсы с таким объявлением, как:
Технический ответ заключается в том, что
ITwo
это наследуетсяIOne
по нескольким причинам:ITwo
инструментыIOne
плоские, неверноITwo
наследуетIOne
методы, еслиMethodOne()
существует,IOne
то он также доступен изITwo
. т.е.:((ITwo)someObject).MethodOne())
действительно, хотяITwo
явно не содержит определения дляMethodOne()
typeof(IOne).IsAssignableFrom(typeof(ITwo))
возвращаетсяtrue
Наконец мы договорились, что интерфейсы поддерживают истинное / полное наследование. Отсутствующие функции наследования (такие как переопределения, абстрактные / виртуальные средства доступа и т. Д.) Отсутствуют в интерфейсах, а не в наследовании интерфейсов. Это все еще не делает концепцию простой или ясной, но помогает понять, что на самом деле происходит под капотом в мире Эрика :-)
источник
Я нашел ответ на вторую часть своих вопросов. Да, класс может реализовать интерфейс, принадлежащий другому классу, если интерфейс объявлен как открытый.
источник
class ContainsAll { private interface INested { /* ... */ } private class MyExample : INested { /* ... */ } }
,MyExample
класс реализует вложенный частный интерфейс. В других примерах вложенный интерфейс (и содержащий его класс) может бытьinternal
. Все зависит от того, кому нужно их использовать и возиться с ними.