Является ли последний флаг явной реализации в интерфейсах семантически бессмысленным?C#

Место общения программистов C#
Ответить
Anonymous
 Является ли последний флаг явной реализации в интерфейсах семантически бессмысленным?

Сообщение Anonymous »

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

Код: Выделить всё

interface IBase {
//public hidebysig newslot virtual instance void
public void DefaultImpl() {
Console.WriteLine("IBase DefaultImpl");
}
}
interface IDerived : IBase {

// no newslot..presumably reusing the one declared above

//private final hidebysig virtual instance void
void IBase.DefaultImpl() {
Console.WriteLine("IDerived DefaultImpl");
}
}
interface IMoreDerived : IDerived {
// this "overrides"
// private final hidebysig virtual instance void
void IBase.DefaultImpl() {
Console.WriteLine("IMoreDerived DefaultImpl");
}
}
class MoreDerivedClass: IMoreDerived {
// this "overrides" too - uncomment to see
//public final hidebysig newslot virtual instance void
//public void DefaultImpl() {
//    Console.WriteLine("MoreDerivedClass DefaultImpl");
//}
}
Все это компилируется без проблем (обратите внимание на сводку флагов IL в комментариях над определениями методов).
Когда мы тестируем, мы видим что реализация IDerived вообще не была окончательной (справедливости ради это видно по отсутствию ошибок компиляции).

Код: Выделить всё

IBase iBase = new MoreDerivedClass();
iBase.DefaultImpl(); // "IMoreDerived DefaultImpl"
Мы могли бы просто опустить Final и использовать виртуальные методы без интервала новостей, чтобы устранить неоднозначность между новыми EIMI и новыми реализациями методов интерфейса по умолчанию (см. IL объявления метода IBase).
Единственная соответствующая официальная информация, которую мне удалось найти, была из Дополнения к спецификации CLI ECMA-335

Методы интерфейса разрешены для MethodImpl и других методов интерфейса
требуется интерфейс (но мы требуем, чтобы MethodImpl были финальными, чтобы
сохранять данные просто) - т.е. интерфейсу разрешено предоставлять (или
переопределять) реализацию метода другого интерфейса

Как обстоят дела оставался простым? Приносится ли здесь семантическое значение в жертву ради повторного использования финала в качестве маркера где-нибудь в качестве детали реализации?

Подробнее здесь: https://stackoverflow.com/questions/786 ... y-meaningl
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»