Пользователь

Добро пожаловать,

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

Меню сайта




Ваше мнение
Поиск по сайту

Активно и часто использую
Использую редко
Обхожусь стандартным рубрикатором
Не знаю, что это такое
Я и сам не знаю, что ищу


Результаты
Другие опросы

Всего голосов: 488
Комментарии: 0


Наши партнеры



Статистика




Programming books  Download software  Documentation  Scripts  Content Managment Systems(CMS)  Templates  Icon Sets  Articles  Contacts  Voting  Site Search




Книги-online



ООП во Flash 5: Объекты

<<    ООП во Flash 5    >>

  Объекты

personA = new Object();

personA - это новый Объект. Теперь можно добавить объекту новые свойства, как это показано ниже:

personA.name = "Ann";
personA.age  = 31;

Это означает, что:

  • personA имеет свойство name; (имя), значение которого равно "Ann"
  • personA имеет свойство age (возраст), значение которого равно 31

    Достаточно просто. То же самое можно сделать по другому:

    personA = { name:"Ann", age:31 }
    

      Примечание

    ActionScript игнорирует пробелы и табуляцию. Например, создать объект personA можно было бы так:

    personA = 
    {
      name : "Bob",
      site : "bob.com",
      favs :
      { 
        site1 : "flash.com",
        site2 : "flesh.com"    
      }
    }
    

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

    o = { x:x, y:y, z:{a:a, b:b} }
    

    Обратите внимание на скобки, запятые, двоеточия и отсутствия точки с запятой в конце строки.

    Фигурные скобки { } быстрый и удобный способ создания объекта. Вот другой объект:

    personB = new Object();
    personB.name  = "Bob";
    personB.age   = 25;
    personB.hobby = "drinking";
    

    А это то же самое:

    personB = { name:"Bob", age:25, hobby:"drinking" }
    

    Это было просто. Теперь у нас есть два объекта: personA и personB. Каждый из них имеет два свойства: name и age, а PersonB имеет еще одно дополнительное свойство hobby (хобби). Если вам что-то не понятно, посмотрите пример еще раз, потому что следующее предложение содержит очень важную информацию.

    Также где-то есть третий объект, имеющий два свойства - personA и personB. Это дает нам первое представление об ООП в работе. Все содержится внутри объекта.

    Если ваши глаза начали стекленеть, подождите... Давайте рассмотрим такую метафору. Представьте, что кто-то переезжает. Это событие влечет за собой перевозку вещей. Здесь есть два подхода. Первый - подогнать грузовик (желательно со съемным тентом) к входной двери и затем погрузить в него вещи, ящики, полки и заплатить шоферу. Это самый быстрый и самый простой способ переезда и он прекрасно работает в жизни. "Нормальный" способ переезда - рассовать вещи по коробкам и подписать (какими-нибудь закорючками) все коробки, согласно их содержанию. Это включает принятие тысячи решений и неотложных действий в час и это хороший тест для супругов, если вы когда-нибудь такой искали.

    Боб и Энн переезжают. Давайте поможем им разложить их вещи по коробкам. Объекты, подобны коробкам, так что это не причинит вреда вашему обучению. Общеизвестно, что американцы самые "переезжающие" люди в мире (ok, после тибетских кочевников). Трое из пяти американцев переезжают каждые пять лет, совершаются миллионы и миллионы переездов. Дальнейшее исследование показало, что в каждом из этих переездов, имеется ящик с пометкой "important stuff" (важные вещи). Учитывая то огромное значение, которое имеет для американцев ящик "important stuff", мы и начнем с него.

    importantStuff = new Object();
    importantStuff.money       = 500;
    importantStuff.papers      = 96;
    importantStuff.annPassport = "er246vjl";
    importantStuff.bobPassport = "kl554mkt";
    

    Заметили, что мы добавили несколько единиц в ящик? А если мы поместим туда что-нибудь еще, что уже находится в другом ящике, например шкатулку с побрякушками?

    importantStuff.jewelryBox = 1;
    

    Это кажется правильным, но если Энн захочет найти свое ожерелье, сможет ли она сделать это? Мы поместили список вещей в каждый ящик, но ее ожерелья нет в списке. Что мы действительно должны сделать - создать список того, что находится в шкатулке с побрякушками, что-нибудь вроде этого:

    importantStuff.jewelryBox = new Object();
    importantStuff.jewelryBox.necklace1 = "Pearl";   // подделка
    importantStuff.jewelryBox.necklace2 = "Diamond"; // подделка
    

    Теперь шкатулка с побрякушками имеет список ее содержимого (конечно же не забываем комментировать при необходимости). Это не лучшее решение для Энн, потому что список ее драгоценностей, находится внутри закрытой шкатулки. Ей потребуется все открыть, чтобы найти свое ожерелье. Однако является удачей для нас то, как объекты ведут себя в ActionScript, поэтому оставим ящики так, как они есть. Надеюсь у нее нет возражений на этот счет.

    Мы поместили объект в объект - ящик в ящик. Теперь не проблема увидеть другой путь. Предложите им использовать два транспортных средства для переезда: автомобиль и грузовик. Часть ящиков сложить в один, часть в другой. "Important stuff" находится в автомобиле, так что ожерелье может быть найдено в car.importantstuff.jewelrybox.necklace1. Это очень похоже на то, что произошло, когда мы создали personA и personB. Мы создавали свои объекты просто "где-нибудь" и это где-нибудь всегда находится внутри объекта, когда вы создаете объекты в ActionScript. В мире Энн и Боба легко увидеть, что, в конечном счете, предельным контейнером будет Земля, Вселенная, ОМ. В ActionScript OM также существует, принимая форму "объекта, вызывающего Объект".

    Итак, эти объекты в объектах кажутся достаточно простыми, но чтобы действительно понять происходящее с ними, придется копнуть много глубже. И с этим углубленным пониманием к вам придет Великая Сила. Осознайте, прочувствуйте ее, текущую по вашим венам. Доверься своим чувствам, Люк. Я твой отец. Давным давно, в далекой, далекой галактике ...

    Давайте попробуем поместить объект внутрь personA, просто посмотрим, как это работает.

    personA.favs = new Object( );
    

    Мы только что добавили новое свойство к personA. Проверьте ваш пульс и продолжайте, когда он придет в норму. Мы легко можем добавить свойства к этому новому объекту favs:

    personA.favs.site1 = "flash.com";
    personA.favs.site2 = "google.com";
    

    Или, как было описано выше:

    personA.favs = { site1:"flash.com", site2:"google.com" }
    

    Теперь можете сказать:
    personA имеет свойство favs, которое имеет свойство site1, со значением "flash.com".
    personA имеет свойство favs, которое имеет свойство site2, со значением "google.com".

      Просто как Flash

    Если это кажется запутанным, хорошо возвратиться непосредственно к Flash'у (с который мы будем много работать). Это всегда было одним из самых лучших конкретных примеров полноценности объектно-ориентированной структуры. Если на сцене имеется мувик (movieclip) personA, то _root имеет свойство, называемое personA. Если вы помещаете мувик в personA и называете его favs, то можете сказать:

    personA имеет свойство, называемое _x, значение которого равно 5.
    personA имеет мувиклип, называемый favs, свойство которого, называемое _x имеет значение равное 100.

    Очевидно, что можно думать о мувиклипах, как об объектах, а о вещах подобных _x или _width, как о свойствах (фактически это то, чем они и являются на самом деле).

    Итак, теперь, когда вы понимаете, как поместить объект в объект, вы знаете все, что необходимо знать об ООП. Это конечно шутка, но не настолько, насколько вы могли бы подумать. Тут важно понять то, что объект подразумевается находящимся внутри другого объекта. Возможно вы знаете все это, часто помещая один мувик внутрь другого, но всегда полезно подвести итог.
     

    Время жизни объектов

    Первая, наиболее очевидная импликация это то, что внутренний (дочерний) объект некоторым образом связан с внешним (родительским) объектом. Это называется родительско-дочерним отношением, хотя в данном случае более точно следовало бы назвать это материнско-зародышевым отношением. Если мать попадает под поезд, младенец в ее утробе разделяет ее судьбу. Если вы удаляете родительский объект, дочерний объект также исчезает. Обратное утверждение, разумеется, не верно, если удаляется дочерний объект, родительский остается неизменным, за одним исключением - минус один дочерний объект. Обратите внимание на то, что дочерние объекты могут иметь только одного родителя. Младенцы могут иметь только одну мать, объекты - только одного родителя (подумайте про муравьиную матку, если встретилось много объектов). Существуют другие типы родительско-дочерних отношений, которые мы в конечном счете обсудим.
     

    Область видимости

    Область видимости является вторым следствием вложенности объектов. Область видимости означает что-то вроде "контекста", в том смысле, "что именно можно увидеть/понять с разных точек/мест". Возвращаясь опять к метафоре с младенцем, младенец может видеть "внутри" своей матери (с фонариком), но не может видеть видеть то, что видит мама. В ActionScript вы можете автоматически делать ссылку на область видимости объекта, в первую очередь, ActionScript будет искать свойства в собственной области видимости объекта.

    Из всех характеристик контейнеров, которые нас больше всего интересуют, наиболее полезной является не их картонность, а их "контейнеробильность" (эдакое вот словечко в стиле Дж. Буша). В контейнеры можно помещать все, что угодно, включая другие контейнеры. Изнутри контейнера, можно видеть только те предметы, которые находятся в нем, но никак не те, что снаружи. И, хотя вы можете видеть другие контейнеры в вашей области видимости, заглянуть внутрь них вам не удастся. Рассмотрим несложный пример. Давайте создадим еще один объект personA:

    personA= 
    {
      name : "Ann",
      favs :
      { 
        site1 : "flash.com",
        test1 : function(){ trace (this.site1) },
        test2 : function(){ trace (this.name ) }
      },
      test3: function(){ trace (this.name )
     },
      test4: function(){ trace (this.site1) }
    };
    personA.favs.test1(); // flash.com
    personA.favs.test2(); // null (ребеной не может видеть родителя)
    personA.test3();      // Ann
    personA.test4();      // null (родитель не может видеть внутри ребенка)
    

    В этом примере, ключевое слово this означает "контейнер, вызвавший эту функцию", что по счастью означает именно тот контейнер, который мы пытаемся увидеть внутри. На данном этапе, совершенно необязательно разбираться в том, как это работает, достаточно на простом языке описать, что будет на выходе каждого свойства test.

    test1: Свойство, называемое site1 в контейнере personA.favs.
           // которое имеет значение "flash.com"
    
    test2: Свойство, называемое name в контейнере personA.favs. 
           // нет такого свойства в personA.favs
    
    test3: Свойство, называемое name в контейнере personA.
           // которое имеет значение "Ann"
    
    test4: Свойство, называемое site1 в контейнере personA. 
           // нет такого свойства в personA
    

    Интересно, что будет, если мы изменим test4 следующим образом:

    test4: function(){return this.favs.site1;}
           // Обратите внимание на '.favs.'
    

    Отлично, работает. Что же на выходе?

    test4: Свойство, называемое site1, в контейнере, называемом favs, 
           который находится в данном контейнере.
           // ? попробуйте найти значение, используя новый test4 код...
    

    Адресное пространство

    Эту тему имеет смысл рассмотреть поподробнее, хотя она и была затронута в последнем примере. Все имеет свое рабочее пространство, которому присваивается имя. Это отличный способ организовать вашу программу, поскольку именно таким образом люди организуют свое окружение в реальном мире. Возьмите, например, ваш адрес. Скорее всего, он выглядит так - имя, номер дома, название улицы, район, город, область, страна. Такой системой пользуется почта. В свое время, так писались и программы - используя огромное количество "имен". По мере того, как они росли в размерах (подобно городам), такая система перестала быть практичной - для организации сложных сообществ потребовалась более совершенная система. Одним из основных преимуществ ООП является именно тот факт, что оно позволяет организовывать сложные вещи. Всему присваивается свой "адрес". По адресу можно сделать некоторые выводы. Так, в объектно-ориентированных языках не существует глобальных переменных (характеристик, которые вы может видеть отовсюду). Для этого есть весомые причины - вы используете объектно-ориентированные технологии именно потому, что вы хотите организовывать вещи. Почта просто не смогла бы нормально работать, если бы люди использовали бы вместо адреса одни только имена - именно так работают и компьютерные программы.

    Ключевая концепция в объектно-ориентированном программировании: Исключительно важно всегда продумывать, куда именно будут направляться объекты в вашей программе. Как именно будет выполнена конкретная задача, зачастую значительно менее важно по сравнению с тем, где она будет выполнена. Представьте себе парочку, занимающуюся любовью в общественной столовой... Вот уж действительно - не так важно "как", как "где" - тот самый случай.

      Просто как Flash

    Возможно, вы все это уже знаете из опыта использования Flash. Именно так работает "целеуказание" клипов. Возьмите клип с именем personA и включите в него клип под названием favs. Теперь, из линейки personA (изнутри контейнера personA), при вызове this._x на выходе будет свойство _x, клипа personA. Если вы вызовете this.favs._x, на выходе будет свойство _x, клипа personA.favs. Если вы создаете свойство this.name="Bob", его значение изнутри клипа favs не будет видно (если только не использовать _parent - всегда ведь найдется обходной путь!). Такое сходство неслучайно - клипы являются таким же типом объекта, как и все остальное.


     

    Связи типа Has-a

    Отлично, это было нетрудно. вы можете создавать объекты, объекты со свойствами (которые часто называются членами (members) или атрибутами (attributes) и эти свойства имеют свои имена и значения. Как мы уже видели, этими свойствами могут быть и другие объекты, которые, в свою очередь, могут иметь свойства и так далее, и так далее... Такой тип связи называется связь типа has a. В терминологии объектно-ориентированного программирования полным-полно длинных слов вроде "полиморфизм" или "инкапсуляция", но хватает и коротких вроде "this", "has a", или "is a"... К счастью, большинство из этих концепций значительно проще поддается пониманию, чем наименованию.

    Связь типа has a состоит в том, что у объекта имеется внутренний объект. Например, у машины имеется ('has-a') топливный бак. У нее имеется ('has-a') рулевое колесо. У нее имеется ('has-a') двигатель. ('has-an' означает тоже самое, что 'has-a'. Английская грамматика!). На первый взгляд, это кажется очевидным, но по сравнению с другими типами связей между объектами вроде is-a (т.е. "является", "машина является средством передвижения"), все не так просто. Объектно-ориентированное программирование во многом опирается именно на эти две концепции.

    Ну, вот - мы опять забегаем вперед. Поэкспериментируйте с нижеприведенными примерами, а потом мы перейдем к классам - шаблонам для создания объектов.

    == Упражнение ==================

    Вот некоторые примеры объектов, в сортировке которых вы можете потренироваться - некоторые простые, некоторые сложные и некоторые не имеют определенного наилучшего решения. (Просто поперемещайте объекты туда и сюда, чтобы их отсортировать.)

    <<link to swf>>
    ===============================

    <<    ООП во Flash 5    >>

     



    Внимание! Если у вас не получилось найти нужную информацию, используйте рубрикатор или воспользуйтесь поиском


    .


    книги по программированию исходники компоненты шаблоны сайтов C++ PHP Delphi скачать