Принципы (свойства) ООП: наследование для чайников (inheritance)
Наследование — важный механизм объектно-ориентированного подхода, позволяющий расширить и/или изменить структуру уже существующего (родительского) класса, путём написания нового класса (потомка), который полностью наследует все свойства и методы и, плюс, добавляет что-то своё. Далее можно начинать создавать и использовать в программе новые объекты с расширенными возможностями.
Если вы плохо понимаете, о чём речь, то к вашим услугам есть вводная про классы и объекты, где проскакивают некоторые страшные вещи, без понимания которых есть опасность перегрева черепной коробки. Можете опять вспомнить биологию: классификацию животного и растительного мира.
Как работает наследование?
Если вы в школе не прогуливали биологию, то к этому моменту у вас уже могли возникнуть смутные ассоциации с классификацией животного и растительного мира (животных и растительных объектов). Это хороший пример проектирования с использованием ООП. Примитивные хордовые — непонятные головастики с хрящиком, а у нас, потомков — огого, какой позвоночник со спинным мозгом внутри! Некоторые им даже думать умудряются. Еще одно доказательство тому, что бог — действующий программист.
Например, возьмем класс «Автомобиль» из вводной статьи и тут же расширим его, написав новый класс «ПодержанныйАвтомобиль»:
Класс: НовыйАвтомобиль { ... переменная марка: Строка; переменная модель: Строка; ... функция заголовокДляПрайсЛиста() { вернуть марка + " " + модель; } функция цена() { ...тут как-то считается цена с НДС и проч. } } Класс: ПодержанныйАвтомобиль расширяет НовыйАвтомобиль { переменная пробег: Целое_число; функция цена() { ...тут как-то считается старая цена ...и, дополнительно, учитывается пробег } }
В данном примере мы создали новый класс-потомок «ПодержанныйАвтомобиль». В дополнение к ранее перечисленным возможностям класса-родителя «НовыйАвтомобиль», «ПодержанныйАвтомобиль» включает в себя новое свойство «пробег» и дополненную версию функции подсчёта цены автомобиля, которая не только считает цену новой машины, но и уменьшает её в соответствии с величиной пробега.
Зачем нужно наследование?
Ни тебе мучений, ни переписываний кусков кода в разных концах проекта, ни поиска непонятных ошибок. Взяли готовое работающее решение и «слегка обработали напильником», не напрягаясь совершенно. Вспомнился анекдот про то, как американцы несколько раз в секретной лаборатории пытались построить по русским чертежам и инструкциям самолёт Су-31, а получался паровоз. Уже почти до расстрелов дело дошло. Пригласили русских. Те заперлись, открывают через неделю дверь и выкатывают распоследнюю модель истребителя. Летчик садится и взлетает. — Как? — падают в обмороки учёные США. — Ну написано же в конце руководства по сборке: «…и слегка обработать напильником.»
Если смешно — посмейтесь пока можете. Потом, когда с помощью нескольких наследований сделаете из паровоза не только самолёт, а ещё подводную лодку, автобус и человекоподобного робота, рефлексов останется только на нервный тик под глазом. Тем, кто до сих пор не сообразил всех плюсов, могу предложить раскинуть в голове ситуацию о программировании монстров к компьютерной игре, характеристики и вид которых известны, и их больше 20-ти разновидностей. Займитесь биомеханической биологией. Не писать же для каждого заново функционал общего назначения? Например, чтоб передвигаться умел и не упирался в стены. И, обратите внимание, тут пока не важно, бегает зверина, или летает, это можно в наследниках определить, унаследовав общую функциональность. Главное, что она двигается (как-то) и умеет отворачивать от препятствий, что будет работать и в конкретных монстрах-потомках, независимо (!!!) от того, летает он, ползает, или прыгает.
15.07.2010 | 10:32
