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