Показать сообщение отдельно
Старый 24.10.2006, 13:15
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 61  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 67. Метод callProperty класса Proxy

Если в классе наследнике от Proxy попытаться вызвать несуществующий метод, то будет вызван метод callProperty, которому передается название метода с массивом аргументов. Это можно использовать для создания динамических методов.

Как и все методы класса Proxy, callProperty объявлен в пространстве имен «flash_proxy» (flash.utils.flash_proxy), чтобы не возникало конфликтов с публичными методами. Для переопределения метода в своем классе обязательно нужно указывать пространство имен flash_proxy.

Пример: класс CustomObject наследуется от Proxy и переопределяет метод callProperty для управления динамическими методами.
Код:
package {
    
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;
    
    dynamic public class CustomObject extends Proxy {
        
        private var variables:Object = new Object(); // хранилище переменных
        
        public function CustomObject() {
        }
        
        // Вызывает при обращении к динамическому методу
        override flash_proxy function callProperty(name:*, ... args):* {
            
            // Преобразуем name в строку
            name = String(name);
            
            var callType:String = name.slice(0,3); // get или set
            var callVariable:String = name.slice(3); // название переменной
            
            switch(callType) {
                
                case 'get':
                    // Если «get», то возвращает значение переменной, если она существует
                    if (callVariable in variables) {
                        return variables[callVariable];
                    }
                    return null;
                    
                case 'set':
                    // Если «set» запомним новую переменную
                    variables[callVariable] = args[0];
            }
        }
    }
}
В этом примере, с использованием callProperty, реализованы динамические методы для чтения и записи «переменных».
Код:
// пример использования
var myObj:CustomObject = new CustomObject();
trace(myObj.getMyVar()); // null
myObj.setMyVar("foo");
trace(myObj.getMyVar()); // foo
myObj.setMyVar("bar");
trace(myObj.getMyVar()); // bar
trace(myObj.MyVar); // не существует (get property error)
В начале getMyVar возвращает null, поскольку переменная «MyVar», еще не определена. После записи при помощи setMyVar, getMyVar возвращает записанное значение.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.