Лекция 14 (Лекции (2009) (Саша Федорова)), страница 2

2019-09-19СтудИзба

Описание файла

Файл "Лекция 14" внутри архива находится в папке "Лекции (2009) (Саша Федорова)". Документ из архива "Лекции (2009) (Саша Федорова)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Онлайн просмотр документа "Лекция 14"

Текст 2 страницы из документа "Лекция 14"

Пример.

Класс FileStream – поддерживает итерфейс IDisposable, содержащий в себе метод Dispose(), который явно помечает объекты как предназначенные для сборки мусора, делая сильную ссылку слабой.

FileStream реализует этот интерфейс явным образом. Но есть в нем невиртуальный метод Close(), вызывающий внутри себе Dispose(). Для чего эо сделано? Очевидно, Close() «аккуратнее», а человеку скорее придет в голову использовать метод Close(), а не Dispose.

При работе с файлами это крайне важно: если не закрыть файл(то есть не вызвать функции Close или Dispose), то он будет открыт до следующей сборки мусора, и снова открыть файл до этого момента будет трудно.

Пример(наверное C#)

class IControl{

void Paint();

};

interface IEdit: IControl{

…………..Paint()…………..

};

Interface IDropList: IControl{

………….Paint()………………….

};

Combobox в средах с графической визуализацией обладает свойствами и IEdit, и DropList, и ему нужны оба Paint().

Как реализовать метод Paint()? Тут, очевидно, напрашивается явная реализация интерфейсов – нам нужы оба метода. Реализовывать надо и для DropList, и для IEdit.

Реализация:

class ComboBox: IDropList, IEdit

{

void IDropList::Paint(){………};

void IEdit::Paint(){……………};

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

public void Paint(){…….IEdit.Paint();…………..}

Заметим, тут стоит public – вотличие от вышестоящей явной реализации, в которой может стоять только private.


};

В реализованном нами кллассе обращаться к методам можно как угодно: и явно, и неявно.

Замечание1. Если посмотреть реализацию некоторых вещей на C#, можно заметить, что многие методы в рализации интерейсов являются ззапечатанными(sealed)., а значит, их нельзя ззаместить. Следовательно, если мы по каким-то причинам попытаемся унаследовать ComboBox

class FancyComboBox{

public void Paint() {...........}; //просто не будет вызван ввиду того, что в C# референциальная модель данных и какую функцию выбрать, будет определяться динамически

//если тут написать override, то тоже будет ошибка – исходный метод ComboBox запечатан.

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

Замечание2. Интерфейсы-маркеры.Реализованы в Ада. Являюются разновидностьюстандартных интерфейсов, относящихся к категории ссылочных типов. Цель маркеров состоит в том, чтобы вызов через интерфейс был равносиелн по эффективности вызову виртуального метода.

Java: Iterable.

Интерфейсы-маркеры – это стандартные интерфейсы, доведенные до абсолюта. Контракт интерфейсов-маркеров описан только в документации. Это пустые интерфейсы, мы не можем увидеть их с своем коде.

Пример: интерфейс Cloneable – класс, поддерживающий этот интерфейс, обязан реализовать метод Clone.

Как мы уже заметили, интерфейсы поддерживают множественное наследование. Остановимся на нем подробнее.

Множественное наследование

Существует мнение, что то, что есть в языке Smalltalk(и не больше!) должно быть в каждом объектно-ориентированном языке. В Smalltalk множественного наследования нет.

В чистом виде множественное наследование есть только в С++,

а в Java, C#, Delphi наследование возможно только для интерфейсов.

Проблема реализации ComboBox в том, что он писался как терминальный в иерархии класс, не предполагалось, что он наследовался.

public new virtual void Paint() {……………..}

Как же нам использовать ComboBox? Можно не наследовать, а включить его.

(Кстати, специалисты Майкрософт слово «включение» заменили словом «агрегация».)

С какими проблемами мы сталкиваемся при множественном наследовании?

  • Конфликт имен

  • Виртуальные методы.

Конфликт имен решается через явное указание имени базы или через приведение к ссылке на базу.

Как обстоит дело с виртуальными методами?

Пусть у нас есть 2 базовых класса A и B и класс наследник С.

C++:

C c;

A * pa;

B * pb;

pa=&c; //в процессе такого присваивания указатели преобразуются. Допустимо

pb=&c; //допустимо

pa->f(); //C::f

pb->g();//C::g

Но! pa->g(); //Нельзя – ошибка – в А нету g().

Вывод: добавление механизма множественного наследования сильно усложняет механизм выова виртуальных методов.

Язык С++ хорош тем, что если мы не используем какие-то супер-особенности языка, мы не платим за это.

Ромбовидное(бриллиантовое) наследование

Пусть есть следующая иерархия классов:

С точки зрения распределения памяти наследование выглядит так:

Пусть А и В совпадают(такая вещь вполне допустима в случае, например, обобщенных списков: если Х содержится в линейном списке и Y содержится в линейном списке, то С содержится в обоих линейных списках)

?

Яркий пример ромбовидного наследования – потоки ввода/вывода. От базового класса base_ios наследуются istream(read) ostream(write). В базовом классе base_ios присутствует в членах-данных файловый дескриптор int fd;. В классе С, унаследованном от классов istream и ostream, будет содержаться 2 копии одного и того же файлового дескриптора.

Пусть base_ios – это А, istream – это Х, а ostream – это Y. тогда распределение памяти будет такое:

А иерархия будет выглядеть вот так:

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

Чтобы базовый класс допускал ромбовидное наследование, надо сделать наследование виртуальным(а точнее, оба наследования):

class A….

class X: public virtual A{

.........................................

};

class Y: public virtual A{

.........................................

};

Ромб реализуется так:

class C: public X, public Y{…………….}

Тут virtual нигде писать не надо.

Вывод: ввиду нетривиальности механизма виртуальных методов и наследования иерархию классов перед программированием надо продумывать целиком сразу.

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5301
Авторов
на СтудИзбе
417
Средний доход
с одного платного файла
Обучение Подробнее