![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Подскажите, как в такой ситуации правильно организовать функции, чтобы не было проблем с вложенными функциями и с областями видимости:
class Room { static var xmlName:String = "1.xml"; var xmlDoc:XML; var xml_rootNode:XMLNode; public function parsXML():Void { trace(xml_rootNode); } public function Init():Void { xmlDoc.load(xmlName); // ошибка - обработчик внутри функции. // хотя может и нет - обработчик нужен 1 раз и удаляется после использования // ? xmlDoc.onLoad = function():Void { if (this.status == 0) { trace("Успешно"); xml_rootNode = this.firstChild; // !!!!! ошибка - эта функция "не видна" отсюда parsXML(); } else { trace("Ошибка при чтении xml "+this.status); } }; } public function Room() { xmlDoc = new XML(); } } |
|
|||||
|
Спасибо большое! Я до этого понятия не имела о Delegate.
|
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
import mx.utils.Delegate;
class Room {
static var xmlName:String = "1.xml";
var xmlDoc:XML;
var xml_rootNode:XMLNode;
public function parsXML():Void {
trace(xml_rootNode);
}
public function Init():Void {
xmlDoc.load(xmlName);
// ошибка - обработчик внутри функции.
// хотя может и нет - обработчик нужен 1 раз и удаляется после использования
// ?
}
public function Room() {
xmlDoc = new XML();
xmlDoc.onLoad = Delegate.create (this, onLoadXML);
}
private function onLoadXML (success:Boolean):Void
//// this теперь ссылается на экземпляр класса Room
if (success) {
trace("Успешно");
xml_rootNode = xmlDoc.firstChild;
// !!!!! ошибка - эта функция "не видна" отсюда
parsXML();
} else {
trace("Ошибка при чтении xml "+xmlDoc.status);
}
};
}
Последний раз редактировалось iNils; 27.11.2008 в 16:28. |
|
|||||
|
Banned
|
А что вообще делегат делает? Возвращает функцию оболочку с нужной функцией вызова apply:
По-любому генерится лишняя функция. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Ага, только в этом коде область видимости не изменится.
Так она генерится в обоих костылях. |
|
|||||
|
Banned
|
Да, это просто схема работы делегата. (код нерабочий, если кто не понял. Чтобы сделать его рабочим надо добавить ссылку на функцию onLoadXML. Например, так: xmlDoc.onLoadXML=onLoadXML)
Но суть в создании лишней функции-оболочки. Последний раз редактировалось chingachgoog; 28.11.2008 в 17:31. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Опять же, this внутри onLoadXML будет ссылаться на xmlDoc, а не на экземпляр Room. Снова область видимости будет неправильной.
|
|
|||||
|
Регистрация: Nov 2008
Адрес: Москва
Сообщений: 52
|
А зачем использовать Delegate, по-моему есть более простой и удобный способ:
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
faust.d503, это кривой и неудобный способ.
|
|
|||||
|
Регистрация: Nov 2008
Адрес: Москва
Сообщений: 52
|
__etc
Расскажите, чем он кривой и неудобный и чем лучше Delegate. Нет конечно можно подключить дополнительный класс, чтобы повысить вес программы, но зачем. Кстати написать функцию прямо внутри конструктора, тоже вполне логичный способ, если парсер используется один раз. Ибо размножать количество методов и переменных класса пусть, и приватных, не всегда хорошо. |
![]() |
![]() |
Часовой пояс GMT +4, время: 15:04. |
|
|
« Предыдущая тема | Следующая тема » |
|
|