Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2015, 22:14   #11
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Цитата:
Откуда столько эмоций?
это вы про что?
вы разберитесь для начала что такое класс и что такое экземпляр, потом и полиморфизм легче пойдет

Base instance = new Repetuz();
тут instance это всего лишь переменная ссылочного типа, позволяющая хранить ссылку на объекты типа Base или его потомков.
В данном случае в ней будет находиться ссылка на объект (экземпляр) класса Repetuz, полностью, а не обрезанный до Base, т.к. реально создается именно такой объект (new Repetuz())
следовательно в его vmt есть все методы которые прописаны у Repetuz, и указывают на код реализованный в репетузе, и в бейзе. Base instance только оговаривает открытый интерфейс с которым можно работать без всяких хитростей (приведение то или рефлексия ..).
Так как реальный объект таки Repetuz то ничто не мешает сделать приведение ((Repetuz)instance ) и вызвать уже те методы которые есть у Repetuz но нет в Base.

Последний раз редактировалось lomastr_; 07.02.2015 в 22:27.
lomastr_ вне форума Ответить с цитированием
Старый 12.02.2015, 18:13   #12
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
это вы про что?
вы разберитесь для начала что такое класс и что такое экземпляр, потом и полиморфизм легче пойдет
Это я чётко всё уже понимаю. Тут вопрос по-сложнее...

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
Base instance = new Repetuz();
тут instance это всего лишь переменная ссылочного типа, позволяющая хранить ссылку на объекты типа Base или его потомков.
В данном случае в ней будет находиться ссылка на объект (экземпляр) класса Repetuz, полностью, а не обрезанный до Base, т.к. реально создается именно такой объект (new Repetuz())
Ну так если создаётся объект не обрезанные до Base, а самого класса Repetuz, значится должно было б быть так, чтоб этот объект видел все методы и поля класса Repetuz без приведения. Иначе не складно как-то. Пытаюсь понять, но не выходит. Что-то тут не то..

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
следовательно в его vmt есть все методы которые прописаны у Repetuz
Что за vmt ?
hoz вне форума Ответить с цитированием
Старый 12.02.2015, 18:21   #13
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Цитата:
Ну так если создаётся объект не обрезанные до Base, а самого класса Repetuz, значится должно было б быть так, чтоб этот объект видел все методы и поля класса Repetuz без приведения. Иначе не складно как-то. Пытаюсь понять, но не выходит. Что-то тут не то..
у объекта они и есть, их нет в интерфейсе (контракте)
lomastr_ вне форума Ответить с цитированием
Старый 12.02.2015, 18:41   #14
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Ох уж эти ученики... Возьмут чисто академический пример и начинается: а зачем? а почему? а можно же так... Привели реальный пример из жизни с коллекциями, но он слишком сложный. Так поэтому и для обучения суют упрощенные варианты, что другие сложные и "такое еще не проходили". Можете вообще писать var instance = new Repetuz();
ООП по книжке не выучите, его пользовать нужно и только с практикой оно придёт. В чем тут вопрос я так и не понял. Всё понятно, но зачем в учебном примере написали такую тупость? Так на то он и учебный пример. Вопрос снят или что-то еще волнует?
ЗЫ. vmt - Virtual Method Table
pu4koff вне форума Ответить с цитированием
Старый 12.02.2015, 19:30   #15
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
у объекта они и есть, их нет в интерфейсе (контракте)
Ну так обычно то всё есть везде... когда так:
PHP код:
Base instance = new Base(); 
Тогда почему здесь нет?

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Ох уж эти ученики... Возьмут чисто академический пример и начинается: а зачем? а почему? а можно же так... Привели реальный пример из жизни с коллекциями, но он слишком сложный.
Ну а как? Реально же без знания коллекций тот пример не понять. А как как же иначе не спрашивая? Ведь примеры на самом деле неочевидные...

Цитата:
Сообщение от pu4koff Посмотреть сообщение
ООП по книжке не выучите, его пользовать нужно и только с практикой оно придёт. В чем тут вопрос я так и не понял. Всё понятно, но зачем в учебном примере написали такую тупость? Так на то он и учебный пример. Вопрос снят или что-то еще волнует?
ЗЫ. vmt - Virtual Method Table
Что б пользовать нужно базу освоить. Вот полиморфизм пойму и буду по тиху пользовать.
P.S. Вопрос не снят, т.к. сами видите, что не всё ясно мне.

Последний раз редактировалось hoz; 12.02.2015 в 19:37.
hoz вне форума Ответить с цитированием
Старый 12.02.2015, 19:47   #16
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Коллекции там не причем вообще, можно и массив, Shape[].
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.02.2015, 20:16   #17
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Скачать можно кучу книг и посмотреть в какой из них будет описано более понятно. Причем можно взять и книжку по С++ и по Делфи, там на 90% одно и то же. Базовые вещи объяснять - дело неблагодарное, т.к. много нюансов.
Всегда можно придумать свой пример. Всегда можно создать свою иерархию классов, прописать вызовы всяких разных методов (виртуальных, перегруженных. статических,...). Для понимания просто в методах пишется что-то типа: Console.WriteLine("Конструктор класса Base");
При выполнении программы будет достаточно наглядно виден порядок вызова методов и где что собственно вызывалось.
Если просто, то полиморфизм - это разное поведение казалось бы одного и того же кода.
Код:
BaseClass a = new BaseClass();
BaseClass b = new DerivedClass();

a.foo();
b.foo();
Если метод foo виртуальный и в классе DerivedClass перегружен, то для a и для b будет выполнен совершенно разный код. Для а выполнится foo из класса BaseClass, а вот для b (хоть и работаем с ним как с объектом BaseClass) вызовется метод из DerivedClass.
pu4koff вне форума Ответить с цитированием
Старый 12.02.2015, 20:54   #18
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Если метод foo виртуальный и в классе DerivedClass перегружен, то для a и для b будет выполнен совершенно разный код. Для а выполнится foo из класса BaseClass, а вот для b (хоть и работаем с ним как с объектом BaseClass) вызовется метод из DerivedClass.
Я это и так понимаю прекрасно. Уже на практике понял. Не понятно тока почему выше lomastr_ заметил, что мол в коде:
PHP код:
BaseClass instance = new DerivedClass(); 
в переменная instance будет находиться ссылка на объект (экземпляр) класса DerivedClass(), полностью, а не обрезанный до Base, т.к. реально создается именно такой объект (new DerivedClass())
Поскольку посредством объекта instance вызвать методы из класса DerivedClass() нельзя, то я и задал вопрос как тогда переменная instance не обрезана до базовой, а является полноценной ссылкой на класс DerivedClass() и в нём имеюются все методы из класса DerivedClass().
lomastr_ заметил, что:
" у объекта они и есть, их нет в интерфейсе (контракте) "
Я не понял причины.
hoz вне форума Ответить с цитированием
Старый 12.02.2015, 22:18   #19
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Цитата:
Поскольку посредством объекта instance вызвать
это переменная а не объект, что тут не понятно?
lomastr_ вне форума Ответить с цитированием
Старый 12.02.2015, 22:27   #20
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Цитата:
lomastr_ заметил, что:
" у объекта они и есть, их нет в интерфейсе (контракте) "
Я не понял причины.
причины чего? вы создали объект типа DerivedClass, вы его и получили, все просто как дважды два
lomastr_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос для приведения к одному, одинаковому размеру графиков REztor Microsoft Office Excel 2 23.12.2012 22:28
Битва экстрасенсов. Приведения, души и т.д. TwiX Свободное общение 5 30.10.2011 15:22
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов Lanx Помощь студентам 0 06.04.2011 20:24
Приведение к типу __Demon__ Общие вопросы C/C++ 1 27.09.2009 17:40
Проблема приведения типов Dec(Leprosus) Общие вопросы C/C++ 14 08.05.2008 04:24