Какова цель атрибута новостной ленты? - PullRequest
1 голос
/ 05 апреля 2019

Я изучаю промежуточный язык через книгу Common Language Infrastructure.В нем говорится, что виртуальный метод типа может быть помечен атрибутом newslot.Но этот атрибут действительно смущает меня, я не могу понять его значение.

Вот цитата:

II.10.3 - Введение и переопределение виртуальных методов

Виртуальный методбазового типа переопределяется путем обеспечения прямой реализации метода (с использованием определения метода, см. §II.15.4) и без указания того, что он должен быть новостным (§II.15.4.2.3).Существующее тело метода также можно использовать для реализации данного виртуального объявления с использованием директивы .override (§II.10.3.2).

II.10.3.1 Представление виртуального метода

Виртуальный метод вводится в иерархию наследования путем определения виртуального метода (§II.15.4).Определение может быть помечено как newslot, чтобы всегда создавать новый виртуальный метод для определяющего класса и любых производных от него классов:

1) Если определение помечено как newslot, определение всегда создает новый виртуальный метод, даже еслибазовый класс предоставляет соответствующий виртуальный метод.Ссылка на виртуальный метод через класс, содержащий определение метода, или через класс, производный от этого класса, ссылается на новое определение (если оно не скрыто определением новостной ленты в производном классе).Любая ссылка на виртуальный метод не через класс, содержащий определение метода, ни через его производные классы, ссылается на исходное определение.

2) Если определение не помечено как новостная лента, определение создает новый виртуальный метод, только если не существует виртуального метода с тем же именем и сигнатурой, унаследованного от базового класса.

Из этого следует, что когда виртуальный метод помечается как новостная лента, его введение не повлияет на любые существующие ссылки на соответствующие виртуальные методы в его базовых классах.

Что означает фраза "определение создает новый виртуальный метод "?Я думал, что внедрение виртуального метода всегда создает новый метод.Я думал, что новостная лента - бесполезный атрибут.Кто-нибудь может привести примеры, поясняющие этот текст, пожалуйста?

1 Ответ

2 голосов
/ 05 апреля 2019

Вы знакомы с модификатором new в определениях методов в C #?- такая же концепция.

Вы говорите, что "этот метод не такой же, как любой метод, который выставляет мой базовый класс, ни сейчас, ни в будущем".Даже там, где мы использовали одно и то же имя.Люди, вызывающие метод X через переменные моего базового класса или далее по моей цепочке наследования, получают метод X из моего базового класса.Люди, вызывающие метод X для переменных моего класса или классов, производных от него, получают этот метод X (если только производные классы не вводят свой собственный метод newslot X)

Главное здесь то, что вуровень IL, переопределение является предполагаемым значением по умолчанию, если доступен переопределяемый метод:

Если определение не помечено как новостная лента, определение создает новый виртуальный метод , только если не существует виртуальногометод с тем же именем и сигнатурой, унаследованный от базового класса .

На уровне IL вы можете пометить переопределение как virtual, тогда как в C # вы не можете.Вот почему newslot является важной отличительной чертой.

...