Вот интересно, при реализации интерфейсов по идее должен использоваться такой же механизм виртуального переопределения, как при реализации абстрактных методов. Однако по умолчанию методы и свойства, реализующие интерфейс, не виртуальные.
Версии:
Используется отдельный механизм. Нафига?
Это только синтаксический сахар для того, чтобы не писать override. То есть на самом деле реализации методов и свойств интерфейса override sealed, когда ничего не написано, и просто override, когда написано virtual. Тогда они совсем не правы, так как данный синтаксический сахар вводит в заблуждение.
Спасибо. Хорошо хоть не платформа, а компилятор .
MF>Здравствуйте, dluciv, Вы писали:
D>>А как (и почему) на самом деле?
MF>У Рихтера написано, что если не указано, компилятор подставляет virtual sealed неявно.
Вот я про это и спросил. А тут компилятор неявно подставляет override sealed, как мне уже ответили.
L>Здравствуйте, dluciv, Вы писали:
D>>А как (и почему) на самом деле?
L>Принцип очень простой — если хочешь какую-то фичу, нужно объявить об этом явно.
Здравствуйте, MatFiz, Вы писали:
MF>Здравствуйте, dluciv, Вы писали:
D>>А как (и почему) на самом деле?
MF>У Рихтера написано, что если не указано, компилятор подставляет virtual sealed неявно.
Странно, запускаем рефлектор и видим, что в реализации интерфейсного метода нет ключевых слов virtual и sealed.
Если включить дизассемблирование в отладчике, то видно, что механизм вызовов совершенно разный.
По видимому дело в чём-то другом...
Здравствуйте, Dufrenite, Вы писали:
MF>>У Рихтера написано, что если не указано, компилятор подставляет virtual sealed неявно.
D>Странно, запускаем рефлектор и видим, что в реализации интерфейсного метода нет ключевых слов virtual и sealed.
Ты просто не туда смотрел:
.method public hidebysig newslotvirtual finalinstance void Test() cil managed
Здравствуйте, dluciv, Вы писали:
D>Вот интересно, при реализации интерфейсов по идее должен использоваться такой же механизм виртуального переопределения, как при реализации абстрактных методов. Однако по умолчанию методы и свойства, реализующие интерфейс, не виртуальные.
Механизм будет как минимум другой. т.к. абстрактный метод это прераготива класса. При этом, классы не допускают множественное наследование а интерфейсы допускают т.е. механим реализации как минимум другой. Более того, разные методы разных интерфейсов могут отображаться на одну единственную реализацию.
В любом случае, почему добавление интерфейса к классу должно менять его поведение? Раз все методы по умолчанию не виртальные то, они должны и оставатся такими же.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
TK>В любом случае, почему добавление интерфейса к классу должно менять его поведение? Раз все методы по умолчанию не виртальные то, они должны и оставатся такими же.
Вот именно. Методы объявлены как не виртуальные, а в коде получаем
.method public hidebysig newslotvirtualfinal instance void Test() cil managed