C# - Явные Интерфейсы с наследованием?

Попробуйте

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID
10
задан Naximus 6 December 2009 в 21:05
поделиться

4 ответа

Нет, не должно.

Вызов Hello эквивалентен закомментированному - способ получения IHello ] не имеет значения (если только это не требует проверки или преобразования во время выполнения); тип времени компиляции - это просто IHello в любом случае, и отображение интерфейса такое же, как бы вы ни попадали.

Когда интерфейс явно реализуется более одного раза в иерархии типов, реализация в используется наиболее производный тип. (При вызове через интерфейс.)

Из раздела 13.4.4 спецификации C # 3.0:

Отображение интерфейса для класса или struct C находит реализацию для каждый член каждого интерфейса указанный в списке базовых классов C. Осуществление конкретного элемент интерфейса IM, где I - интерфейс, в котором член M является заявлено, определяется путем рассмотрения каждый класс или структура S, начиная с C и повторяя для каждого последующего базовый класс C, пока не будет найдено совпадение находится:

  • Если S содержит объявление явного члена интерфейса реализация, соответствующая I и M, тогда этот член является реализацией of IM
  • В противном случае, если S содержит объявление нестатического общедоступного члена, который соответствует M, тогда этот член является реализацией IM. Если совпадает более одного члена, не указано, какой член является реализацией IM Эта ситуация может возникнуть только в том случае, если S - это сконструированный тип, в котором два члена, объявленные в универсальном типе, имеют разные подписи, но аргументы типа делают свои подписи идентичными.
21
ответ дан 3 December 2019 в 16:53
поделиться

(A) a ничего не делает. Ссылка уже объявлена ​​как a, поэтому приведение ее к A не будет иметь никакого эффекта.

Даже если ваша ссылка объявлена ​​как A, объект, на который она ссылается, имеет тип B. Если вы приведете этот объект к IHello, вызов to Hello () вызовет явную реализацию Hello в объекте B.

Результат точно такой, как ожидалось.

3
ответ дан 3 December 2019 в 16:53
поделиться

Нет, не должно.

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

Когда вы создаете экземпляр класса B , фактический тип объекта будет ] B . Причина, по которой он печатает «Это класс A». , заключается в том, что вы не переопределили метод ToString в классе B , вы затенили его с помощью новое ключевое слово. Таким образом, класс B имеет два метода ToString , один унаследованный от класса A , а второй - его теневой. Если вы используете ссылку A для вызова метода ToString ,

0
ответ дан 3 December 2019 в 16:53
поделиться

Нет, когда вы создаете новый метод (ToString), он не является виртуальным. Новое просто означает, что вы не Имейте в виду, что он «скрывает» версию в базовом классе - поэтому, если вы вызываете его со ссылкой, приведенной к определенному типу (A), он выполняет метод в классе A, независимо от фактического типа объекта, который вы звонят. (т.е. вы вызвали A.ToString (), поэтому он выполнил A.ToString ())

Когда вы создаете виртуальный метод, то независимо от того, к какому типу вы приводите ссылку, реализация из фактического используется тип объекта (т.е. вы создали B, поэтому, когда вы вызываете (какой бы объект ни был). Привет, он вызвал B.Hello)

Ключевое различие в том, что один вызов является виртуальным, а другой - нет.

независимо от фактического типа вызываемого объекта. (т.е. вы вызвали A.ToString (), чтобы он выполнил A.ToString ())

Когда вы создаете виртуальный метод, то независимо от того, к какому типу вы приводите ссылку, реализация из фактического используется тип объекта (т.е. вы создали B, поэтому, когда вы вызываете (какой бы объект ни был). Привет, он вызвал B.Hello)

Ключевое различие в том, что один вызов является виртуальным, а другой - нет.

независимо от фактического типа вызываемого объекта. (т.е. вы вызвали A.ToString (), чтобы он выполнил A.ToString ())

Когда вы создаете виртуальный метод, то независимо от того, к какому типу вы приводите ссылку, реализация из фактического используется тип объекта (т.е. вы создали B, поэтому, когда вы вызываете (какой бы объект ни был). Привет, он вызвал B.Hello)

Ключевое различие в том, что один вызов является виртуальным, а другой - нет.

0
ответ дан 3 December 2019 в 16:53
поделиться
Другие вопросы по тегам:

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