Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 2

Upcasting и виртуальные методы

14.12.2017, 01:26. Показов 1083. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет
Догадываюсь что сабж баян, но все-таки, оооочень прошу знающих "разжевать" что именно происходит в коде:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    class A
    {
        public virtual void M()
        {
            Console.WriteLine("A");
        }
    }
 
    class B : A
    {
        public override void M()
        {
            Console.WriteLine("B");
        }
    }
 
    class C : B
    {
        public new virtual void M()
        {
            Console.WriteLine("C");
        }
    }
 
    class D : C
    {
        public override void M()
        {
            Console.WriteLine("D");
        }
    }
 
 class Program
    {
        static void Main(string[] args)
        {
            D d = new D();
            C c = d;
            B b = d;
            A a = d;            
            d.M(); // D
            c.M(); // D
            b.M(); // B
            a.M(); // B
        }
}
если я правильно понимаю, строки 37 - 40, сначала создается ссылка типа D на инстанс типа D, а далее создаются 3 ссылки, более базовых что ли типов, на все тот же инстанс, при это выполняется апкастинг. Далее, опять таки если я правильно понимаю, каждая ссылка c, b и a, при обращении к их методам, позволяет обратиться к методам только своего типа, более базового по отношению к инстансу (в нашем случае типа D). Т.е. апкастинг, не зависимо от текущего инстанса, скрывает методы самого интсанса,и предоставляет возможность вызвать только свои (тип к которому привелись), либо родительские методы.
Дааа, как-то коряво задал вопрос...
Ладно, мне вроде как понятно почему в 41 строке выводится D и в 43 выводится В, а с 42 и 44 вообще не могу вкурить что там происходит, кто-то кого-то скрывает, но при этом все ссылаются на один и тот же обьект.

Короче говоря, если есть такие кому не сложно, объясните пожалуйста, что происходит со строки 37 по строку 44. Буду весьма благодарен. Ну или хотя бы ткните в нужную литературу, где об этом можно подробно почитать.

P.S. Читал Аблахари, суховато там написано как по мне: - ссылки полиморфны - и маленький пример про сокрытие и переопределение методов. Я во всяком случае, вроде уцепился за мысль, но постоянно от меня эта нить ускальзывает...

Спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.12.2017, 01:26
Ответы с готовыми решениями:

Виртуальные статические методы
вычитал на стэковерфлоу что их не предусмотрено, т.к. противоречат принципам ооп и т.д.т.д. но например, есть класс, представляющий...

Полиморфизм. Виртуальные методы
Здраствуйте уважаемые админы!!У меня проблемы:swoon: с некоторыми предметами,у меня к вам очень большая просьба помогите с лабой...

Виртуальные методы и наследование
Здраствуйте. Не могли бы вы помочь добавить к этой программе наследование и виртуальные методы? using System; using...

2
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
14.12.2017, 01:34
на данном этапе обучения забудь об этом,в общем неплохом, но слишком перемудреном, варианте...
почитай, для начала, что то полегче для восприятияЛитература по C# для начинающих и не только
З.Ы. это пример таит для новичка много подводных камней, нужно базовое понимание... и если этот, конкретный пример, тебе разжуют, то шаг в право/лево тебя опять поставит в тупик
0
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 2
14.12.2017, 18:51  [ТС]
"Спасибо" товарищу Diamante за очень дельный совет: читать литературу для начинающих. Уверен что я бы там быстро нашел ответы на свои вопросы...

Ну да ладно, возможно для кого-то это окажется полезным.
Как оказалось (это я узнал уже после долгого гугления), этот пример был взят из спецификации языка C#, раздел 10.6.3 "Virtual methods", хотя я с ним столкнулся на лекции, и в нем всего лишь изменены имена методов...

Вот ссыль (правда там нумерация не совпадает: стр 297 - 297, раздел 15.6.4 "Virtual methods")
Также, есть книга "Язык программирования C#. Классика Computers Science." 4-е изд. Хейлсберг А., Торгерсен М., Вилтамут С., Голд П., которая является, как я понял, переводом спецификации на русский язык, корявым (Sealed метод - бесплодный метод, к примеру) и не самым свежим переводом, но тем не менее. Инглиш в спецификации ну ооочень запутанный, и лично мне его сложновато читать.

Так вот, цитата из этой книги (стр 520):
...В этом примере классы C и D содержат по два виртуальных метода с одинаковыми сигнатурами: первый введен в A, а второй — в C. Метод, введенный в C, скрывает метод, унаследованный от A. Таким образом, объявление override в D переопределяет метод, введенный в C, при этом в D невозможно переопределить метод, введенный в A....
...Заметьте, что скрытый виртуальный метод можно вызвать, обратившись к экземпляру D через тип более высокого уровня, в котором этот метод не скрыт....
Помимо спецификации, еще помог SO (в гугле первая ссылка по запросу "Чем отличаются override и new"), кот. помог мне понять почему в строке 42 выводится D, а в 44 выводится В, в обоих случаях идет обращение к методам, которые "заоверрайжены" в наследниках.
А именно:
Если вы работаете с экземпляром класса-наследника через его родительский класс, то в случае, если вы будете вызывать переопределенный виртуальный метод (override), то будет вызвана его реализация из наследника, а если перекрытый (new), то будет вызван метод базового класса
Правда, исходя из спецификации, перед этим еще идет Overload resolution, а потом уже определение виртуальный это метод или нет... Ну на данный момент это для меня достаточно сложно плюс перегруженных методов в этом примере нету, по этому в сам resolution я пока не стал вникать, мне бы эту "виртуальность" в голове.
Вот собственно такое мое видение и понимание этой ситуации.

P.S. На счет Overloading и Inheritance Скит советует следующее: avoid overloading across inheritance boundaries...

Просьба к знающим, поправить меня, если я написал какую-то ахинею.
Спасибо

CSharp Language Specification 6.0.pdf

Хейлсберг А., Торгерсен М., Вилтамут С., Голд П. - Программирование C#, 4-е изд (Классика Comput.pdf
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.12.2017, 18:51
Помогаю со студенческими работами здесь

Позднее связывание и виртуальные методы
Добрый день. Возник вопрос по поводу позднее связывания в c#. В с++ п.с. можно организовать следующим образом: class A: { public: ...

Виртуальные методы,с комментариями пожалуйста
Родительский класс:Вектор(поле-название) Потомки: (Двумерный вектор(поля:компоненты вектора), Трехмерный вектор(поле размерность)). ...

Скрыть виртуальные наследуемые методы
Делаю кароч либу, но вот хочу у наследуемых классов скрыть методы от родительского класса. Ну вот тип пример class Parent ...

Виртуальные методы и юнит-тесты
В C# пришел недавно из Java, где все методы виртуальные. И сразу столкнулся с тем, что в C# по умолчанию методы невиртуальные, более того,...

Виртуальные методы. Перекрытие методов.
Гетерогенная ЛВС состоит из различных устройств: коммутаторы, маршрутизаторы, хосты, принтера. Взаимодействие между объектами ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru