Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Развитой ООП (http://www.flasher.ru/forum/showthread.php?t=119193)

Sheff_88 14.12.2008 19:57

Развитой ООП
 
Всем здравствуйте!=)
Никак не могу поймать "фишки" ООП ActionScript3. В php прекрасно получалось, здесь немного растерялся.

Значит создаю flash док. для примера. В нем два произвольных объекта, связанных со своими классами. К примеру, obj1 и obj2. Файлы структуры
Код AS3:

package {

import flash.display.MovieClip;
public dynamic class obj1{

public var somevar:String="some text";
function obj1(){
trace(obj2.somevar)
}
}
}

лежат в корне проекта.
хочу, чтобы obj1 "слышал" obj2.
нужно для этого дубликаты классов создавать?
или дуиликат с именем класса при старте создается?
Проблема в том, что вышеописанный код в функции-конструкторе выдает ошибку:
1119: Access of possibly undefined property somevar through a reference with static type Class.

Просто хотелось бы услышать совет как лучше обеспечивать связь и видимость классов в сложном проекте.

Спасибо.

kackbip 14.12.2008 20:12

Есть разные методы проектирования. Здесь AS3 или php разница не принципиальная. А ошибка у вас возникает из-за того, что экземпляр класса obj1 не имеет ссылки на свойство(или метод) с именем obj2. Вероятно вам нужно области видимости повторить.

Sheff_88 14.12.2008 20:18

А в AS3 есть что-то вроде global в php?
Ну, т.е. прямо внутри класса obj1 пропасать (к примеру) global obj2?

BlooDHounD 14.12.2008 21:07

в ООП это называется static.

Sheff_88 14.12.2008 21:39

т.е., код, к примеру, должен быть таким?:
Код AS3:

package {
 
    import flash.display.MovieClip; public dynamic class obj1{
 
        public var somevar:String="some text"; function obj1(){
 
            trace(obj2.somevar) //возвращает Error....
            static obj2;
            trace(obj2.somevar) //возвращает "some text"
 
        }
 
    }
 
}

Добавлено через 1 минуту
Бред какой-то получается, т.к. static как раз не позволяет слушать/изменять класс. Для этого они dynamic и объявлены...

DarkLight 14.12.2008 21:49

Что такое у Вас obj2? он нигде не объявлен.
Похоже с ООП в PHP у Вас тоже опыта маловато.
http://php.ru/manual/language.oop5.static.html - читать про static в php
В ас3 оно функционирует так же.
dynamic - дает право на добавление классу свойств/методов на стадии выполнения и в общем случае его использование нежелательно, так как вносит неопределенность относительно наличия/отсутствия у класса функционала и увеличивает количество ошибок.

Sheff_88 14.12.2008 22:03

obj2 - тоже самое что obj1.
К объекту MovieClip привязан класс. Если он присутствует на первом кадре, дубликат класса автоматом создается? Если да, то с каким именем? С именем объекта MovieClip?

Добавлено через 47 минут
Да, при старте создается экземпляр класса с именем, указанным в properties объекта.
По ходу начинаю втягиваться)))))))))))))))

7thsky™ 15.12.2008 00:08

Нда, видать крутой у вас ООП в ПХП был :)

Класс obj1 - у вас к MovieClip'у ни каким местом не привязан :)
Дубликат класса :)

Если как Вы грите что класс obj1 привязан к MovieClip'у - для начала он должен наследоваться от MovieClip, тем самым расширяя базовый класс.
На тему как это в PHP

Есть классы и и экземпляры класса. Если у вас есть какой нить мувик, который лежит сцене, это фактически экземпляр класса (который расширяет базовый класс флэш плеера - flash.display.MovieClip).

Ну и т.д.

О :) Перечитал, и понял в чем "фишка"
Вы хотите повторить подобную конструкцию во флэше?

PHP код:

<?php

$obj1 
= new ('Some Text');
$obj2 = new ();

echo 
$obj2->testIt ();

class 
{
    
    public 
$name;
    
    function 
__construct ($name) {
        
$this->name $name;
    }
    
}

class 
{
    
    public function 
testIt () {
        global 
$obj1;
        echo 
$obj1->name;
    }
}
?>

Вообще использование в данном контексте global $someVar - это больше хак чем ООП. Самый простой ООП вариант - это использовать например singleton класс, реализующий модель апликации (ну там можно хранить общие для разных компонент данные и прочее), но это тоже...

Во флэше есть понятие документ класс. То есть флэше плеер создает при загрузке swf файла, экземпляр Document Class'а ассоциированный с этим swf файлом. Как задать этот класс - про это тут (на английском).

BlooDHounD 15.12.2008 00:46

я думал, что в этой строчке:
Код:

trace(obj2.somevar)
идёт обращение к классу obj2, и соответственно свойство somevar должно быть статическим. а тут видимо совсем беда ...

wvxvw 15.12.2008 00:57

Собственно, применительно к ПХП примеру выше: в АС тоже можно складывать несколько классов в один файл (физически), но есть различия с ПХП / C# и тому подобными... т.е. это можно делать только если:
- существует только одна паблик сущность (т.е. только 1 класс / функция / переменная / неймспейс с модификатором доступа типа public).
- все остальные классы / функции и т.д. объявленные в этом же файле будут автоматически помещены в неймспейс private и доступны только "соседям по файлу".

В данной ситуации global не нужен, т.как все классы объявленные в одном файле будут видны друг другу, но, с перечисленными выше ограничениями.


Часовой пояс GMT +4, время: 03:54.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.