Наследование
Всё, что мы делали до сих пор можно охарактеризовать, как "композиция". В нашем случае это слово означает придумывание, составление объекта из более мелких компонентов, а не урок музыки. Наверняка вы уже используете композицию в ваших программах. Прежде, чем мы двинемся дальше, давайте дадим этому понятию точное определение, дабы потом не забыть, что же это такое. Как уже было сказано ранее, это понятие часто обозначается, как "имеется" (Has a). У объекта А имеется объект В. В доме имеется кухня, у собаки имеется хвост, у мятежника имеется причина. Трудно представить себе объект, у которого или в котором ничего не имеется (то есть ничего нет), в конце концов, во всём имеется (есть) что-то, всё из чего-то состоит. Однако всегда ли это так? Как насчёт самих идей? Например, какое отношение имеет "приспособление" к "холодильнику"? Какое отношение "разводной ключ" имеет к "разводу" или к "инструменту"? Какое отношение Джеймс Дин имеет к Рональду Рейгану? К Элвису? К Че Геварре? Как только мы начинаем организовывать идеи и концепции, одних "имеющихся" понятий становится недостаточно. Теперь нам потребуется "наследование" -- понятие из разряда "являющихся" (Is a).
Прежде чем продолжить, давайте познакомимся с этим понятием. Понятие "имеющийся" предполагает содержание одного предмета в другом. В машине есть двигатель, в двигателе есть поршни, в поршнях есть... э-э-э... такие маленькие круглые чёрные штуковины, кажется (прошу прощения, но этим ограничиваются мои познания в автомобилях). Понятия "являющиеся" используются, когда один объект является типом другого. Так автомобиль является транспортным средством, транспортное средство является машиной, машина является созданным человеком приспособлением с различными вращающимися частями (ещё раз прошу прощения!). Теперь самое время остановиться и поразмыслить о различных системах наследования. Вот некоторые разъяснения.
"Наследование" несложно осознать, но его трудно представить визуально. В реальном мире ничто не ведёт себя абсолютно одинаково. "Наследование", это скоре подсознательная система классификаций, если так можно выразиться. Очень просто увидеть млекопитающее, когда с ним разговариваешь, но ведь такого животного, как "млекопитающее" не существует. Есть только типы млекопитающих. Это обстоятельство, конечно же, не означает, что слово "млекопитающее" для нас бесполезно. Но ведь нет же в зоопарке клетки с надписью "млекопитающее". Раньше мы говорили об объектах, как о коробках или контейнерах. Это допустимо для "композиции", где вы помещаете одни объекты внутрь других. Однако такого рода определения не работают при использовании "наследования". Чтобы представить себе "наследование", нам понадобится немного другая модель.
Давайте-ка ещё раз убедимся, что мы поняли разницу между "имеющимися" и "являющимися" отношениями между объектами (рассмотрим хотя бы простейшие случаи). Изучите нижеприведённый список и определите, являются ли отношения между объектами в каждой строке "наследованием" или "композицией" - "являющимися" или "имеющимися". Попробуйте найти единое общее для каждой группы "являющихся" (наследований), а также для всех "имеющихся" (композиций) примеров.
Теперь давайте вместе подробно рассмотрим эти примеры (только не будем на них особенно задерживаться!)
Пудель - это собака, собака - это млекопитающее, млекопитающее - это животное. Какие свойства добавляются на каждом уровне? Попробуйте "прикрепить" вот эти: шерсть, глаза, дикий, домашний.
В компьютере есть материнская плата, на материнской плате есть процессор и так далее. Если у компьютера есть кнопка включения, есть ли она у процессора? (только ради бога не говорите, что у процессора их 5 миллиардов!). А теперь попробуйте ответить на подобный вопрос, если речь пойдёт о животных и собаках.
Элвис был рок-звездой, рок-звезда - это певец, певец - это артист. А все ли рок-звёзды - певцы? И куда в этом списке поместить актёров? Мы видим, что "Элвис" - это пример, а всё остальное - классы.
В кухне есть раковина, а раковина домом не является (разве только для тараканов в студенческом общежитии). Теоретически, можно вырезать кухню и утопить её в океане. Но кухня останется кухней. Это объект в доме.
Каждый следующий физически находится в предыдущем. Можно, конечно, вообразить взаимообмен компонентов, например, устроить на кухне (которая давно на дне океана) компьютерный отдел. Огромное преимущество использования организованных объектов заключается в том, что один и тот же объект можно использовать в нескольких различных местах.
Все они являются типами или подтипами. Книга по actionscript - это книга по компьютерной тематике. А примеры в этой цепочке есть? Какой пример вы бы добавили?
Этот пример с хитринкой. Перечисленные компоненты не всегда физические. Конечно, вы можете дотронуться до параграфа в любой книге, но, тем не менее, если мы говорим о книге вообще, то "наследование" не подходит. В книгах есть главы, предложения состоят из слов. Такая логика подходит и для предыдущих примеров на "Композиция", однако, в данном случае это более наглядно. На кухнях бывают раковины, и в моей кухне есть раковина. В обоих случаях раковина - это компонент кухни. Не путайтесь!
Хотя на этот раз абстрактное мышление просто необходимо, это всё же композиция. Совершенно очевидно, что улица - это не разновидность страны. Таким образом одни концепции могут быть компонентами других концепций. Внутри контейнера "континент" находятся "страны". В свою очередь "страны" содержат "регионы"...
Такая же иерархия, как и в предыдущем случае, только здесь мы видим конкретные примеры. Каждая концепция теперь снабжена объектом, но объекты эти являются компонентами и содержатся один в другом. На континенте Азия есть страна Китай. В стране Китай есть город Сиань.
В домене macromedia.com есть раздел под названием support. А в нём вы найдёте что-нибудь по Flash. Сюда вы можете обратиться, если ничто другое не помогает. Здесь вы можете найти копию справочного руководства. Подумайте, что представляет собой структура каталогов на вашем жёстком диске - "Композиция" или "Наследование"? И любая ли система каталогов может считаться композицией? Подумайте хорошенько.
Да, программы объектно-ориентированы... в документах есть полоса прокрутки, на полосе прокрутке есть указатель (это такая маленькая штука, которую вы тянете мышкой)...
Да, программы тоже используют наследование. Очередь на печать - это тоже разновидность окна, равно как и остальные (диалоговое окно и сообщение об ошибке).
Пирог - это еда, десерт - это еда. Обратите внимание, что структура древоподобна. Просто помните, что десерт может быть разный, равно как и пирог. Все эти структуры древоподобны.
Это всё равно, что сказать "Северная Америка > Манитоба > Майами > мой старый телефонный номер". Телефонная система очень похожа на почтовую. Чтобы вас найти, здесь используется строго структурированный каталог имён.
Наследование, как и объектно-ориентированное программирование вообще, становится необходимым инструментом, когда у вас появляется достаточно классов подобных друг другу и они начинают как бы само-организовываться (мечты, мечты!). Методика в любом случае достойна упоминания, потому что многие программы на основе Flash довольно просты и невелики в объёмах. Более того, нагромождать многочисленные уровни наследования для того лишь, чтобы привязать кнопки к страницам, это абсурд. Если же вы способны написать подобную маленькую программу, вы почувствуете себя начальником почтового отделения в небольшой деревеньке. Чтобы доставить почту, вам не нужно ничего, кроме имени получателя. В случае каких-либо изменений, если, например, кто-то приехал в город или изменил место жительства или же улица поменяла название, у вас есть возможность просто запомнить всё это. Вы станете смеяться над почтальонами больших городов, которые принимают всерьёз все эти нудные и непонятные правила и часами спорят из-за незначительного изменения в списке почтовых индексов. С другой стороны, ведь почта так и так доходит до адресата, и в больших и в малых населённых пунктах. Но до тех пор, пока вы знаете, что ваша деревенская система отличается от городской, вы можете быстро и чисто справляться со своими задачами, отвечая возрастающим потребностям, это факт. В конце концов, вам не нужно разделять млекопитающих до бесконечности - от собак до атомов. Одно из первостепенной важности умений в объектно-ориентированном программировании - умение найти золотую середину между сложностью и завершённостью (кстати, перед подобной же дилеммой стоит и автор, которому нужно написать короткую главу об ООП в ActionScript!).
<<
ООП во Flash 5 >>