русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Наследование и полиморфизм


Дата добавления: 2015-07-09; просмотров: 848; Нарушение авторских прав


Чтобы продемонстрировать механизм наследования классов рассмотрим несколько простых классов, которые будут описывать транспортные средства: автобус, такси, троллейбус и трамвай. Базовым классом у будет класс "траспортное средство", который определим следующим образом (напоминаю, что создаем мы его после стандартного класса Program):

Смысл этого класса хранить и распечатывать информации о транспортном средстве. Любое транспортное средство имеет такие характеристики как скорость, масса и грузоподъемность. Однако для автотранспорта есть еще дополнительные характеристики такие, как расход топлива, а у электротранспорта есть такая дополнительная характеристика как напряжение. Поэтому создадим еще два класса. С использованием технологии наследования. Наследование - это технология проектирования классов, позволяющая создавать новые классы на базе предыдущих классов. При этом классы наследники будут иметь все поля и методы родительского класса. А к тем полям и методам, которые имеют спецификатор доступа public или protected, можно будет обращаться из наследного класса.

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

Теперь класс Bимеет все поля и методы класса A. Однако поля и методы класса A, имеющие классификатор доступа private, будут недоступны для класса B.

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

Создадим два класса (автомобиль и такси) наследников от класса TAuto и два класса (трамвай и троллейбус) наследников от класса TElectro. У каждого нового класса могут быть дополнительные поля и методы.

Предположим, что у нас будет список различных транспортных средств, для которых нам нужно вычислить отношение стоимости единицы полезной массы к расходу топлива (бензина или электроэнергии). Создадим массив транспортных средств:



Заметим, что у нас в массиве Trans все элементы из разных классов, хотя и родственники класса TTransport. Можно, перебирая массив Trans, для каждого экземпляра класса подсчитать нужное соотношение. Но тут возникает проблема - ведь у половины классов нужно делить значение Payload на значение Petrol, а у половины нужно делить значение Payload на значение Voltage. Тем более, что идеология объектно-ориентированного программирования подразумевает, что классы сами должны обрабатывать собственные данные. Поэтому мы поступим следующим образом - мы добавим в наши классы метод Calc(). При этом воспользуемся технологией полиморфизма. Полиморфизм - это возможность объектов с одинаковой спецификацией иметь различную реализацию. Cоздадим у класса TTransport виртуальный метод:

Ключевое слово virtual означает, что наследники данного класса смогут изменить код данного метода. Сейчас мы еще модифицируем у родительского класса TTransport метод Print следующим образом:

Результат нулевой потому что мы еще нигде не реализовали метод вычисления нужного коэффициента. Мы пометили метод Calc как виртуальный, и теперь мы можем заменить этот метод у классов потомков. Сделаем следующие модификации наших классов:

Теперь наша программа выдаст нужный результат:

Чтобы оценить всю мощь полиморфизма, нужно обратить внимание, что метод Calc вызывается в методе Print класса TTransport! Ведь при наследовании мы можем и не иметь исходного текста класса TTransport, этот класс может быть доступен только в виде откомпилированной библиотеке. Тем не менее механизм полиморфизма позволяет нам модифицировать виртуальные методы.

В родительском классе TTransport нам пришлось фиктивно реализовать метод Calc, хотя с точки зрения проектирования это не очень правильно. Во-первых, плохо писать код только для того, чтобы он был, а, во-вторых, плохо писать неверный код: возвращать 0. Развитое объектно-ориентированное программирование позволяет создавать так называемые абстрактные классы. Абстрактные классы могут содержать абстрактные виртуальные методы. Абстрактный метод содержит только объявление, но не имеет реализации. Разумеется, абстрактный метод является виртуальным, но ключевое слово virtual не пишется, чтобы в наследных классах можно было перекрыть этот метод. Более того, невозможно создать экземпляр абстрактного класса, а наследник абстрактного класса или сам должен быть абстрактным или обязан реализовать все абстрактные методы. И в завершение нашей программы:

 

Если что-то не получается- пишите. Если выдаются ошибки – тоже пишите, отвечу на все вопросы.

Хорошего всем дня. И да прибудет с вами сила!

 

 

Это на следующее занятие задание. Делать пока не надо.

 



<== предыдущая лекция | следующая лекция ==>
Новый объект и обращение к нему производим в нашем главном классе Program. | Практическая задача


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.155 сек.