Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 1,2 > сlasses in Flash


Автор: AlDev 7.9.2005, 11:04
начал писать небольшой manual.

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

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

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

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

http://slovari.yandex.ru/art.xml?art=gl_natural/245/245_592.HTM&encpage=gl_natural&mrkp=http%3A//hghltd.yandex.com/yandbtm%3Furl%3Dhttp%253A//encycl.yandex.ru/texts/gl_natural/245/245_592.HTM%26text%3D%25EE%25E1%25FA%25E5%25EA%25F2%25ED%25EE-%25EE%25F0%25E8%25E5%25ED%25F2%25E8%25F0%25EE%25E2%25E0%25ED%25ED%25EE%25E5%2B%25EF%25F0%25EE%25E3%25F0%25E0%25EC%25EC%25E8%25F0%25EE%25E2%25E0%25ED%25E8%25E5%26reqtext%3D%2528%25EE%25E1%25FA%25E5%25EA%25F2%25ED%25EE%253A%253A133775%2B%2526/%25281%2B1%2529%2B%25EE%25F0%25E8%25E5%25ED%25F2%25E8%25F0%25EE%25E2%25E0%25ED%25ED%25EE%25E5%253A%253A26584%2B%2526%2B%25EF%25F0%25EE%25E3%25F0%25E0%25EC%25EC%25E8%25F0%25EE%25E2%25E0%25ED%25E8%25E5%253A%253A9501%2529//6%26%26isu%3D2

итак, сам принцип такого программирования основывается на понятиях класса и объекта.
Что такое класс и что такое объект?
итак, допустим есть такое понятие - девушка. У девушки есть параметры: имя, рост, вес, возраст, размер груди, размер талии ну и прочее .Что умеют девушки? ну пусть, например, они умеют ... визжать. Добавим ещё такой параметр, как громкость визжания. Визжать - это действие. Возьмём какую-нибудь конкретную девушку, например, Ксюшу. Рост у Ксюши пусть будет 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).
http://livedocs.macromedia.com/flash/mx2004/main_7_2/00001152.html

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

Сохраняем этот файл в той-же папке, где сохранили 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/

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

Автор: Caramel 7.9.2005, 16:03
Меня тоже))))

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

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

http://www.kirupa.com/developer/oop2/AS2OOPClassStructure8.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.

Автор: Jlekc 8.9.2005, 12:11
как все реализовываеться я знаю, я спрашиваю в чем разница?

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

Автор: AlDev 8.9.2005, 13:40

Цитата

interface

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

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

http://novemberain.com/livedocs/Help/ActionScriptLangRef/00001372.html

Цитата

intrinsic

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

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

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

http://novemberain.com/livedocs/Help/ActionScriptLangRef/00001373.html

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

или я опять что-то не так понял?

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

Автор: DeMoNN 7.12.2008, 23:38
класс!
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)