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

Вы действительно спрашиваете о двух (по крайней мере) разных случаях:

  1. final для локальных переменных
  2. final для методов / классов

Джон Скит уже ответил 2). Около 1):

Я не думаю, что это имеет значение; для локальных переменных компилятор может определить, является ли эта переменная окончательной или нет (просто проверяя, назначена ли она более одного раза). Поэтому, если компилятор хотел оптимизировать переменные, которые назначаются только один раз, он может сделать это независимо от того, действительно ли объявлена ​​переменная final или нет.

final может внести изменения в поля защищенного / открытого класса; компилятору очень сложно выяснить, установлено ли поле более одного раза, поскольку это может произойти из другого класса (который, возможно, даже не был загружен). Но даже тогда JVM может использовать технику, которую описывает Jon (оптимизируйте оптимистично, верните, если класс загружен, который меняет поле).

Итак, я не вижу причин, почему это должно помочь производительности , Таким образом, такая микро-оптимизация вряд ли поможет.

Изменить:

Собственно, согласно ответам Тимо Уэсткемпера, final может улучшить производительность для полей классов в некоторых случаях. Я стою исправлен.

122
задан Cœur 28 July 2017 в 02:42
поделиться

4 ответа

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

class USBDevice : GenericDevice, IOurDevice

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

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

233
ответ дан 24 November 2019 в 01:23
поделиться

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

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


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

public interface ITwo : IOne

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

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

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

19
ответ дан 24 November 2019 в 01:23
поделиться

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

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

20
ответ дан 24 November 2019 в 01:23
поделиться

Это связано с различием между загрузкой программы в память и выделением ресурсов для запуска. Даже самые простые программы должны иметь пространство кода, пространство данных и возможность получения оперативной памяти и выполнять операции ввода-вывода. Инфраструктура для выполнения этих низкоуровневых задач абсолютно разная между платформами, если у вас нет какого-то адаптационного слоя, как WINE или Cygwin.

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

-121--1884451-

Проблема 1 - формат изображения. Когда приложение запускается в исполнение, ОС должна загрузить образ приложения, выяснить его точку входа и запустить его оттуда. Это означает, что ОС должна понимать формат изображения, и между различными ОС существуют различные форматы.

Проблема 2 - это доступ к устройствам. После запуска приложение может читать и записывать реестры в ЦП, и все дело в этом. Чтобы сделать что-либо интересное, например, отобразить персонаж на консоли, ему необходим доступ к устройствам, и это означает, что он должен запросить такой доступ у OS. Каждая ОС имеет свой API, который предлагается для доступа к таким устройствам.

Неполадка 3 - это инструкции по привилегиям. Недавно запущенный процесс, возможно, потребуется место в памяти, чтобы что-то сохранить, не может выполнить все с regiestries. Это означает, что ему необходимо выделить ОЗУ и настроить преобразование из VA в физический адрес. Это операции с привилегиями, которые может выполнять только ОС, и снова API для доступа к этим службам зависит от ОС.

Итогом является то, что приложения записываются не для ЦП, а для набора примитивных сервисов, предлагаемых ОС. альтернатива заключается в написании приложений против набора примитивных служб, предлагаемых виртуальной машиной, и это приводит к более или менее портативным приложениям, таким как приложения Java.

-121--1884452-

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

1
ответ дан 24 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: