Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сlasses in Flash, object-oriented-programming 
:(
    Опции темы
AlDev
Дата 7.9.2005, 11:04 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 8
Всего: 50



начал писать небольшой manual.

Итак, что такое ООП и как оно реализовано во Flash.
Простите за возможные неточности в формулировках определений.

Достаточно часто Flash-еры, особенно начинающие, когда им в ответ на вопрос дать ссылку на класс, начинают спрашивать, что это такое? И разве это ActionScript? А как этим пользоваться? Попробую ответить на все эти вопросы.

Итак, что вообще такое ООП?
как мне сказал Yandex:
Цитата

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

© Yandex Словари

итак, сам принцип такого программирования основывается на понятиях класса и объекта.
Что такое класс и что такое объект?
итак, допустим есть такое понятие - девушка. У девушки есть параметры: имя, рост, вес, возраст, размер груди, размер талии ну и прочее .Что умеют девушки? ну пусть, например, они умеют ... визжать. Добавим ещё такой параметр, как громкость визжания. Визжать - это действие. Возьмём какую-нибудь конкретную девушку, например, Ксюшу. Рост у Ксюши пусть будет 160, вес - 50, возраст - 17, размер груди - '90', рахмер талии - '60', прочее - '90', громкость визжания - 50, ну и имя, будет "Ксюша". Так вот девушки - это класс, а Ксюша - объект класса "девушки".
Таким образом класс представляет собой некоторый набор методов и свойств, присущих всем объектам данного класса.
Итак, теперь всё это в применении к Flash.
Открываем Flash, нажимаем Ctrl + N, выбираем type - ActionScipt File.
Объявление класса начинается с ключевого слова class, далее идёт имя класса. Сам код класса содержится между { и }
Итак, объявляем класс - девушки.
Код

class girl
{
}


у любого класса есть конструктор - метод класса, одноименный с ним, вызывающийся при создании объекта данного класса. Добавим конструктор в наш класс:
Код

class girl
{
  function girl()
  {
    trace ('create girl');
  }
}

файл с кодом класса сохраняем как girl.as. Важная особенность - имя класса должно совпадать с именем файла.
Теперь создаем новый Flash-документ, открываем actions для первого frame-а и пишем в нём:
Код

var my_friend:girl = new girl();

что мы сделали? var указывает на то, что идёт объявление перемменной с именем my_friend, после имени переменной поставлено двоеточие, а после него написано название нашего класса. Это двоеточие явно указывает, что это объект класса girl. Некоторые примеры с указанием типа:
Код

var a:Number = new Number;
var c:Number;
var d:String;
var o = new Object;

нигде не будет выдваться ошибка. На самом деле типы - это фича, доступная только при компилляции:
Цитата

Types are a compile-time-only feature. All types are checked at compile time, and errors are generated when there is a mismatch. (For more information, see Appendix A, "Error Messages," in Using ActionScript in Flash.) Mismatches can occur during assignment operations, function calls, and class member dereferencing using the dot (.) operator. To avoid type mismatch errors, use strict data typing (see "Strict data typing" in Using ActionScript in Flash).
© livedocs.macromedia.com

Но смысл указывать типы есть. Это может очень помочь при отладке кода.

Сохраняем этот файл в той-же папке, где сохранили girl.as и нажимием Ctrl + Enter. В окошке output видим надпись: "'create girl".

Вернёмся к нашим девушкам. Итак, нам требуется объявить некоторые свойства класса. Возвращаемся к файлу girl.as и пишем:
Код

class girl
{
  var name:String;
  var age:Number;
  var height:Number;
  var weight:Number;
  var bosom_size:Number;
  var waist_size:Number;
  var priest_size:Number;
  var squealing_volume:Number;
  function girl()
  {
    trace ('create girl');
  }
}


писать var при объявлении переменных - обязательно. Комментарии пишуться так-же, как и при написании обычного кода в Actions.
Код

class girl
{
  var name:String; //girl name
  var age:Number; 
  var height:Number;
  var weight:Number;
  var bosom_size:Number;
  var waist_size:Number;
  var priest_size:Number;
  var squealing_volume:Number;
  /*
    * class constructor
   */
  function girl()
  {
    trace ('create girl');
  }
}

как установить значения переменных для объекта класса?
вернёмся к нашему fla-файлу:
Код

var my_friend:girl = new girl();
my_friend.name = 'Ksenya';
my_friend.age = 17;
my_friend.height = 160;
my_friend.weight = 50;
my_friend.bosom_size = 90;
my_friend.waist_size = 60;
my_friend.priest_size = 60;
my_friend.squealing_volume = 200;


ещё один способ писать без обращения к my_girl:
Код

var my_friend:girl = new girl();
with (my_friend)
{
  name = 'Ksenya';
  age = 17;
  height = 160;
  weight = 50;
  bosom_size = 90;
  waist_size = 60;
  priest_size = 60;
  squealing_volume = 200;
}

с одной стороны это, конечно, удобно. with указывает, что идёт работа с объектом my_girl. Минус - большая затрата ресурсов при таком синтаксисе.
Получение значения переменной класса происходит тоже очень просто:
Код

var my_friend:girl = new girl();
my_friend.name = 'Ksenya';
trace (my_friend.name);


теперь остановимся поподробнее на переменных класса.
1. modifiers
modifiers - это модификаторы доступа к перемнной класса. Возможны 3 варианта:
private
public
static

private указывает на то, что переменная доступна только внутри данного класса и в классах, наследующих от данного класса. О наследовании поговорим попозже.
Итак, пример:
Код

class girl
{
  private var weight:Number;
  var name:String; //girl name
  var age:Number; 
  var height:Number;
  var bosom_size:Number;
  var waist_size:Number;
  var priest_size:Number;
  var squealing_volume:Number;
  /*
    * class constructor
   */
  function girl()
  {
    trace ('create girl');
  }
}

мы сделали переменную weight private, пробуем установить ей значение и получить его:
Код

var my_friend:girl = new girl();
my_friend.weight = 50;
trace (my_friend.weight);

выдаётся ошибка. Удобно? Ещё как!

public - это аттрибут, который ставится по-умолчанию. С переменными public можно творить всё, что угодно, откуда угодно. Очень неплохо, когда это прописывается явно. Облегчается читабельность исходника. Пример:
Код

class girl
{
  private var weight:Number;
  public var name:String; //girl name
  public var age:Number; 
  public var height:Number;
  public var bosom_size:Number;
  public var waist_size:Number;
  public var priest_size:Number;
  public var squealing_volume:Number;
  /*
    * class constructor
   */
  function girl()
  {
    trace ('create girl');
  }
}


третий модификатор - static. Он указывает на то, что переменная не относитя к экземплярам объекта, а относится к самому классу. С первого раза фраза кажется непонятной, но на самом деле это очень удобно для написания различных классов, которые являются хранилищем методов и свойств. Обращение к таким переменным идёт через имя класса: Например у класса Math:
Код

trace (Math.PI);

PI - свойство класса.

2. Обращение к переменным класса внутри самого класса.
Итак, например, мы хотим передавать значение веса и имени при вызове конструктора класса. Тогда пишем:
Код

class girl
{
  private var weight:Number;
  public var name:String; //girl name
  public var age:Number; 
  public var height:Number;
  public var bosom_size:Number;
  public var waist_size:Number;
  public var priest_size:Number;
  public var squealing_volume:Number;
  /*
    * class constructor
   */
  function girl(name:String, weight:Number)
  {
    this.name = name;
    this.weight = weight;
  }
}


перед именами - this
----------------------------------------
в ближайшее время допишу:
3. Привязка переменной к классу
4. get/set
5. methods
6. наследование
7. eval & classes
8. packages
9. classpaths
10. include?
11. dynamic classes attachments
12. toString(), valueOf(), etc... what's that?
13. intrinsic и interface

дополнения буду писать здесь и у себя:
http://batsuev.com/wp/flash/flash-oop/

Это сообщение отредактировал(а) Alex Batsuev - 7.9.2005, 18:43
PM MAIL WWW ICQ YIM MSN   Вверх
ProgrammerBOTANIK
Дата 7.9.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 706
Регистрация: 27.4.2004

Репутация: нет
Всего: 0



Меня порадовало, спасибо!
Добавлено @ 11:53
!!!


--------------------
Сострадание со стороны жизни выражается в смерти
PM MAIL   Вверх
Caramel
Дата 7.9.2005, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4190
Регистрация: 7.8.2004
Где: Дюссельдорф

Репутация: нет
Всего: 142



Меня тоже))))

PM MAIL WWW Skype   Вверх
Jlekc
Дата 7.9.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: нет
Всего: 4



есе уже начали разбераться, то вопросик:
чот не оч понимаю в чем разница между intrinsic и interface


--------------------
PM MAIL ICQ   Вверх
AlDev
Дата 7.9.2005, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 8
Всего: 50



Цитата(Jlekc @ 7.9.2005, 21:43)
чот не оч понимаю в чем разница между intrinsic и interface

http://www.kirupa.com/developer/oop2/AS2OO...sStructure8.htm
Цитата

The best and probably the only situation where you personally, as a developer, would physically create an intrinsic class yourself would be if you were using ActionScript 1.0 classes within your ActionScript 2.0-based movie.

PM MAIL WWW ICQ YIM MSN   Вверх
Jlekc
Дата 8.9.2005, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: нет
Всего: 4



как все реализовываеться я знаю, я спрашиваю в чем разница?

единственный вариант использовать intrinsic для реализации екземпляров класа с помошью прототипной модели, но зачем? Есе использования intrinsic class подразумевает использование AS2


--------------------
PM MAIL ICQ   Вверх
AlDev
Дата 8.9.2005, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 8
Всего: 50




Цитата

interface

Ключевое слово; определяет интерфейс. Интерфейс подобен классу, но имеет следующие важные отличия:

    * Интерфейсы содержат только объявления методов, но не их реализацию. То есть, каждый класс, у которого есть интерфейс, должен обеспечивать реализацию для каждого метода, объявленного в интерфейсе.
    * Только общедоступные члены допускаются при определении интерфейса; экземпляры и члены класса недопустимы.
    * Выражения get и set не допускаются при определении интерфейса.

http://novemberain.com/livedocs/Help/Actio...f/00001372.html

Цитата

intrinsic

Ключевое слово; позволяет во время компиляции производить контроль типов для ранее определенных классов. Flash использует встроенные описания классов для контроля типов во время компиляции встроенных классов, таких как Array, Object и String. Это ключевое слово говорит компилятору, что не требуется реализация функции, и что для нее не требуется генерация байт-кода.

Ключевое слово intrinsic может быть использовано еще при объявлении переменных и функций. Flash использует это ключевое слово в файле topLevel.as для контроля типов во время компиляции для глобальных функций и свойств.

Ключевое слово intrinsic было создано специально для контроля типов во время компиляции для встроенных классов и объектов, а также для глобальных переменных и функций. Это ключевое слово не для предназначено для общего употребления, но, возможно, некоторые разработчики ищут способы контроля типов во время компиляции для ранее определенных классов, особенно если эти классы были определены с использованием ActionScript 1.0.

http://novemberain.com/livedocs/Help/Actio...f/00001373.html

разница:
intrinsic используется для контроля типов для встроенных классов и объектов и для классов, написаных на AS1.
interface - для as2 классов.

или я опять что-то не так понял?
PM MAIL WWW ICQ YIM MSN   Вверх
Jlekc
Дата 8.9.2005, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: нет
Всего: 4



хмм, может быть использовано при объявлении переменных. вот это действительно интересно.
этот недостаток в интерфейсах иногда раздражал


--------------------
PM MAIL ICQ   Вверх
DeMoNN
Дата 7.12.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 21.3.2008

Репутация: нет
Всего: 2



класс!
Спасибо!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Flash"
AlDev
SoWa
  • Если вы хотите предложить кому-либо работу, то пишите или в личку, или оставляйте сообщения в специально предназначеном для этого форуме "Объявления о найме специалистов"
  • Один вопрос - одна тема. Не надо переходов от одного вопроса к другому.
  • Если вы хотите показать какой-нибудь ваш мульт, причём показать, а не предоставить исходник, то вам сюда
  • Вопросы по разработке интернет-приложений на Flex и вопросы по MXML пишите в раздел Flex
  • Смотрим в будущее. ActionScript 3 обсуждается в форуме ActionScript 3
  • Новости из мира Flash.
  • New! [code=ascript][/code] - подсветка ActionScript + wikipedia help

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, AlDev, SoWa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | ActionScript 1,2 | Следующая тема »


 




[ Время генерации скрипта: 0.1345 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.