PDA

Просмотр полной версии : Помогите разобраться в классах


dark256
14.12.2010, 18:16
В ООП я полный чайник, по мере сил пытаюсь разобраться, но выходит плохо. Каких-то винтиков видмо не хватает у меня в сером процессоре. Всвязи с чем вопрос - что это такое происходит?

Итак п.1. пишем класс с ОДНОЙ функцией.

class serv
{
static function HEL1()
{
trace("Hello World")
}
}


Создаю ONE.SWF.
Код внутри:
serv.HEL1()

Создаю TWO.SWF.

Код внутри тот же самый.

Далее MAIN.SWF грузит в себя через МКЛ сначала ONE.SWF, потом , по окончании загрузки, TWO.SWF.

По окончании каждой загрузки получаю свои хэлловорлды:
Hello World
Hello World

Далее ввожу в класс еще одну функцию:

class serv
{
static function HEL1()
{
trace("Hello World")
}

static function HEL2()
{
trace("Hello iNils")
}
}

Модифицирую содержимое TWO.SWF:
serv.HEL2()

Заливаю НОВЫЙ перекомпиленный TWO.SWF на сервер и после запуска получаю:

Hello World
undefined

Если теперь перекомпилить и перезалить ONE.SWF, то все нормально:

Hello World
Hello iNils

Что при этом получается?
Первая загруженная и запущенная СВФ где-то регистрирует класс SERV и после этого все, что загружено после - работает только с методами этого первого класса? Но ведь локально сама по себе каждая свф-ка нормально отрабатывает все методы класса! Они же в нее вкомпилены?
Как подгруженный клип может изначально блочить данное имя, инстанс или что это такое для всех последующих клипов, в которых так и так этот метод уже вкомпилен?

То есть я эту багу нашел, но теперь при добавлении новых функций - мне приходитя перекомпиливать и перезаливать ВСЕ свф-ки, работающие с методом класса SERV.

Это как-то можно вылечить, или что ж я не так делаю? :)

А ну и естсесвнно что локально на компе - все рабоатет. Удаленно - нет. Сандбокс молчит.

etc
14.12.2010, 23:42
Классы в подгруженных swf инициализируются только в том случае, если их нет у загружающего swf.

Psycho Tiger
14.12.2010, 23:48
Классы в подгруженных swf инициализируются только в том случае, если их нет у загружающего swf.
Речь идёт об одном домене, я полагаю?

UPD: ах, это AS2. Прошу прощения)

etc
14.12.2010, 23:51
Речь идёт об одном домене, я полагаю?

UPD: ах, это AS2. Прошу прощения)

Об AS2, да.

dark256
15.12.2010, 03:48
Ага. Так, тема пошла. Думал уж никто не ответит.
1. Домены разные:
MAIN Вконтакте
ONE и TWO на моем сервере.

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

2. Майн ЮЗАЕТ класс SERV, НО перекомпиляция и перезаливка MAIN - не помогает. Метод "не появляется".

Приходится перекомпилять именно ВСЕ, что юзает SERV и идет при этом ДО TWO.

А эксперименты с бубном и всякими super global __proto__ public синглтонами и иже с ними - пробовать даже безполезно?
Просто хочется хотя бы понять о чем читать в мануале. Чтобы разобраться...
Пока на наводящее на правильные мысли ключевое слово в ваших комментах не наткнулся :(
Присоветуйте хотя бы какой раздел ООП читать.

etc
15.12.2010, 12:31
Перед загрузкой другого swf надо делать delete _global.serv;

dark256
15.12.2010, 14:12
Идея понравилась! Попробовал. Тогда MAIN.SWF теряет доступ к методам класса и после подгрузки первой же SWF-ки более ничего не работает.
А переопределить методы существующего класса, или, точнее дополнить как-то - можно?
Ну не знаю я ничего толком про это все :)

etc
15.12.2010, 14:16
Дополнить нельзя, только убить и создать через подгрузку другого SWF заново.

dark256
15.12.2010, 14:23
Мммм.... ну допустим у меня в MAIN лежит код:
my_btn.onRelease = function(){ serv.HEL1()}
Он работать после убиения и подгрузки новой СВФ перестает.
Сама подгруженная СВФ работает качественно, действительно с новым своим классом.
Может надо еще что-то вроде написать _global.serv = this.serv?

etc
15.12.2010, 14:26
После подгрузки работоспособность должна восстановиться.

dark256
15.12.2010, 14:54
нда. локально - заработало!
раскладываю по серверам - не хочет.
Но это уже очень замечательно и есть куда копать хоть!
Огромное спасибо!

etc
15.12.2010, 14:56
Я уже не помню, но там что-то насчет allowDomain нужно.

dark256
15.12.2010, 15:37
Оооо!!! allowDomain прописал все возможные, и insecure и cross-ы и даже
new LocalConnection().allowDomain = function( domain:String):Boolean{ return true }
К сожалению у флэша есть глюки, которые сандбокс не оплевывает, но из-за разных доменов оно не хочет воркать. Самое мое последнее найденное - getBounds(). Убил двое суток на поиск причин.

Из-за этих плясок с бубнами соседи скоро милицию вызывать начнут :))