Форум 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=172152)

TanaTiX 02.12.2011 22:24

Определить наличие свойства/метода
 
Как определить наличие у абстрактного экземпляра класса определенного свойства (свойство как таковое и/или геттер/сеттер)? Мысли на этот счет есть, но все кажется сильно кривым и "закостылистым"... Спасибо.

GBee 02.12.2011 22:35

hasOwnProperty?

PainKiller 02.12.2011 22:35

Что значит у абстрактного экземпляра класса?

Inet_PC 02.12.2011 22:49

in, не?
У абстрактного значит у любого? Ибо абстрактных классов в AS3 нет.

TanaTiX 02.12.2011 23:22

PainKiller, т.е. не имеет значения экземпляр какого именно класса мы исследуем.

GBee, Inet_PC, да, но такие способы вернут true даже если доступен только геттер и, соответственно, вернут false, если доступен только сеттер.

Inet_PC 02.12.2011 23:50

тогда describeType Вам в помощь.

TanaTiX 03.12.2011 00:22

Inet_PC, сам describeType такую проблему не решит, но вкупе с одним из вышеприведенных способов... Спасибо за хорошую мысль.

Psycho Tiger 03.12.2011 00:24

Пардон конечно, но на кой хрен это надо?

TanaTiX 03.12.2011 00:38

Psycho Tiger, есть желание управлять изначально неизвестным свойством объекта. Создаю "скроллер". А вот что в качестве "скроллируемого" значения он будет "кушать" - изменение значения x, y, rotation или someValue - его интересовать не должно.

Psycho Tiger 03.12.2011 00:42

Ну да.
Но чего ты добьешься?
Смотри:
Код AS3:

var sprite:Sprite=new Sprite();
if (has("x")) sprite.x=10;
if (has("other")) sprite.other=5;
else throw new Error("Нет такого значения!");

И... всё. Только чуть более понятный текст RTE. Иначе вылетит нативное.
Это... не то, ради чего стоит стараться. Или я не так понял задачу?

TanaTiX 03.12.2011 00:46

Вот что я имел ввиду. Если бы все было так просто и очевидно... Но по ходу без небольшого костыля - никуда.
Код AS3:

package modules.scrollbar 
{
        import flash.utils.describeType;
        /**
        * ...
        * @author TanaTiX - Nikonov Anton
        */

        public class ScrollerUtil
        {
                public static const READ_ONLY:String = "readonly";
                public static const WRITE_ONLY:String = "writeonly";
                public static const READ_WRITE:String = "readwrite";
 
 
                public function ScrollerUtil()
                {
 
                }
 
                public static function checkProperty(target:Object, parameter:String, access:String = READ_WRITE):Boolean {
                        var xml:XML = describeType(target);
                        if (parameter in target) {
                                if (access === READ_ONLY) {
                                        return true;
                                }
                                for each(var item:XML in xml.accessor) {
                                        if (item.@name == parameter) {
 
                                                if (item.@access === READ_WRITE) {
                                                        return true;
                                                }
                                                if (access === WRITE_ONLY && item.@access === access) {
                                                        return true;
                                                }
                                                return false;
                                        }
                                }
                        }
                        return false;
                }
        }
}


GBee 03.12.2011 00:58

Может тут уместнее заюзать интерфейс? Универсальность в какой-то мере до добра не доведет.

TanaTiX 03.12.2011 01:06

GBee, а каким образом в данном случае поможет интерфейс?
Цитата:

Универсальность в какой-то мере до добра не доведет.
Спорить даже не буду, т.к. это моя маленькая маничка. Но я о ней помню и стараюсь контролировать :) На сколько получилось будет ясно, когда закончу.

GBee 03.12.2011 01:31

Цитата:

Psycho Tiger, есть желание управлять изначально неизвестным свойством объекта. Создаю "скроллер". А вот что в качестве "скроллируемого" значения он будет "кушать" - изменение значения x, y, rotation или someValue - его интересовать не должно.
Цитата:

GBee, а каким образом в данном случае поможет интерфейс?
А объекты, свойства которого скролятся не только ваши? Просто можно прикрутить интерфейс со списком параметров для изменения (включая ограничения по значениям).

Цитата:

Спорить даже не буду, т.к. это моя маленькая маничка. Но я о ней помню и стараюсь контролировать На сколько получилось будет ясно, когда закончу.
Это я не для спора. Удачи по-любому. :о)

Bgg 03.12.2011 01:37

Цитата:

Сообщение от TanaTiX (Сообщение 1049439)
Но по ходу без небольшого костыля - никуда.

Это не небольшой, это эпических размеров костыль. Который не только не удобен, но и опасен. Пользуйтесь интерфейсами, это удобно, красиво и понятно всем.

Inet_PC 03.12.2011 02:20

Я лично не очень понял, что Вы хотите в итоге. Но костыль это еще пол беды, вторая половина, это то, что describeType жутко медленный (оно и понятно). Во флексе даже кэш для этой функции есть, я бы не стал использовать ее без явной на это необходимости.

TanaTiX 03.12.2011 02:21

Цитата:

Который не только не удобен, но и опасен. Пользуйтесь интерфейсами, это удобно, красиво и понятно всем.
А можно пример того, когда опасно? И когда с помощью интерфейса это удобно и красиво? Само собой разумеется, я не прошу за меня написать код, мне просто интересны ключевые моменты использования в данном контексте интерфейсов.

Inet_PC, то что медленный - знаю, но с другой стороны на один скролл он будет использоваться только один раз, что я считаю допустимым. Ну и если Bgg (или кто-нибудь другой) предложит достойную альтернативу - буду только рад воспользоваться хорошей идеей.

Psycho Tiger 03.12.2011 13:00

@TanaTiX, это понятно.
Приведи примеры где ты это будешь использовать, чтобы понять, в чем выгода.

3p.station 03.12.2011 13:21

как вариант
myScroller = new MyScroller(target:IScrollable, ...arg)

public interface IScrollable
{
function get height():Number;
function set height(value:Number):void;
......
}
Тоесть объект который вы отдаете скроллеру должен имплементить этот интерфейс, и значит должен иметь сеттер/геттер height например

TanaTiX 03.12.2011 13:39

3p.station, Psycho Tiger, хочется немного другого. Хочется не создавать n-е количество разных скроллов (вертикальных, горизонтальных, радиальных и еще хз каких придумает воспаленный мозг). Хочется задать базовый объект (ползунок), его минимальное и максимальное значение и свойство. Т.е. для горизонтального скролла это примерно должно выглядеть так:
Код AS3:

//создание скролла
var horizontalScroll:Scroll = new Scroll(someMovieClip, "x", 100, 250);
//конструктор
public function Scroll(target:DisplayObject, value:String, minValue:Number, maxValue:Number)

Таким образом для того чтоб поменять "направление" скролла, нет необходимости плодить классы, достаточно поменять один атрибут.

А то что касается определения определения наличия свойства - это для защиты от дурака.

Bgg 03.12.2011 13:55

Цитата:

Сообщение от TanaTiX (Сообщение 1049485)
А то что касается определения определения наличия свойства - это для защиты от дурака.

Абсолютной защиты от дураков нету. И если он таки появляется, то ему нужно это указывать.

Код AS3:

public static const X:int = 0;
public static const Y:int = 1;
public static const ZOOM:int = 2;
 
public function Scroll(target:DisplayObject, type:int, minValue:Number, maxValue:Number){
 
  if(type !== X || type !== Y || type !== ZOOM){
    throw new ArgumentError("Дурак, тип скролла задается константой. Читай документацию к скроллу.");
  }
 
}


TanaTiX 03.12.2011 14:16

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

Bgg 03.12.2011 14:35

Имхо перегибаете. Чем класс проще, тем лучше. Но если все равно дико хочется универсальности, то я бы не писал статичный метод проверки свойства, а написал бы обработчик ошибок на момент скролла:
Код AS3:

private function _scrollObj(value:Number):void{
  try{
    _obj[value] += value;
  }catch(error:Error){
    //если дебаг версия, то выкидываем исключение для программиста, если релиз, то ничего не делаем.
  }
}

Кстати можно в конструкторе сделать подобную проверку тоже, и не придется писать конкретные свойства) Но это опять костыль.

ps. и да, бросайте заботиться о дураках.

smithy 03.12.2011 14:43

@TanaTiX, а почему не сделать чтобы скроллер диспатчил событие ScrollEvent.CHANGE с параметром position, и в обработчике уже менять свойство какого-то объекта?

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

TanaTiX 03.12.2011 14:56

Цитата:

ps. и да, бросайте заботиться о дураках.
:quiet:
Цитата:

Скроллер по-моему не должен в принципе знать что за объект и какие его свойства он изменяет. Он должен только выдавать значения в заданном диапазоне, а что делать с этими значениями - это его не касается.
Так и есть. В моем создается несколько уровней. Для каждого своя задача. Для вычислений используется один класс, для собственно присвоения значений другой и т.п. Нравится мне "принцип единственной обязанности"© :)

cleptoman 03.12.2011 15:02

я понял..сколько людей столько и разных скролов.)
у меня он просто диспатчит CHANGE и все..к кому и как применять в хендлере - не его забота. т.е. скролл и таргет одного поля ягоды.

smithy 03.12.2011 15:06

Цитата:

Так и есть. В моем создается несколько уровней. Для каждого своя задача. Для вычислений используется один класс, для собственно присвоения значений другой и т.п. Нравится мне "принцип единственной обязанности"©
Зачем тогда передавать в скроллер target?

TanaTiX 03.12.2011 15:13

Цитата:

я понял..сколько людей столько и разных скролов.)
Во истину :)
smithy, скроллер не является DisplayObject-ом. Это что-то типа "контроллера", которому "скармливаются" различные объекты (в т.ч. DisplayObject-ы) и параметры. Таким образом я смогу собрать любой скроллер из любых объектов (созданных программно, нарисованных в IDE и пр.)

Psycho Tiger 03.12.2011 15:25

Цитата:

А то что касается определения определения наличия свойства - это для защиты от дурака.
Я тебе о чем и говорю.
new Sprite().value даст нативное RTE. Всё, чего ты добьешься - поменяешь текст RTE.
А если класс dynamic?

TanaTiX 03.12.2011 15:32

Psycho Tiger, да, соглашусь, такая мысля уже закрадывалась, но, видать, не сильно настойчиво. Может быть тогда оставлю только для дебага (чтоб себе, дураку, понятней было :away:), а из релиза нафиг! В общем посмотрим.


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

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