PDA

Просмотр полной версии : Как узнать кто вызвал метод


HardCoder
27.12.2011, 22:00
Здравствуйте! Есть класс CL1, который ничего не знает, что творится за его пределами. У класса есть метод func1(). В любом другом классе (например CL2) создается экземпляр класса CL1. Этот экземпляр вызывает метод cl1Instance.func1();
Так вот как мне в функции func1() узнать кто ее вызвал? То есть как получить ссылку на cl1Instance? Заранее благодарен.

i.o.
27.12.2011, 22:17
cl1Instance есть экзепляр от CL1. Следовательно - this внутри func1()

HardCoder
27.12.2011, 22:28
Вот это я...! Ничего, торможение - тоже движение. Спасибо. А вопрос создавался с целью узнать из какого класса был вызван метод. Так вот как узнать кому принадлежит экземпляр cl1Instance? То есть в каком классе был создан cl1Instance?

i.o.
27.12.2011, 22:30
Вот это вряд ли. Только в дебаг плеере можно узнать стек вызовов через (new Error("")).getStackTrace();

HardCoder
27.12.2011, 22:37
Спасибо. Вся эта каша связана с тем что есть гет/сет свойство. Но одни классы могут вызывать сеттер, а другие не должны. Вот и подумал поставить проверку в сеттере из какого класса он был вызван, и соответственно запрещать или разрешать изменение переменных. Создавать и использовать интерфейсы определяющие гет или сет для определенных экземпляров не хочу. Вернее в моем случае - это будет слишком запутанно.

expl
27.12.2011, 22:48
Я обычно (и судя по этому форуму еще не один разарботчик) забивают и просто держат в голове ряд прявил, кому можно менять, кому нельзя. Проблем не создавало.
В библиотеках можно модификатор internal использовать, но штука очень ограниченная. Может неймспесы? - не знаю, не пробовал.

Вообще это как синглтонами(не к ночи будь помятуты) - народ мучается, проверят, не создан ли экземпляр второй раз, выбрасывает исключение. А результат? Я за всю жизнь словил это исключение только 2 раза. Просто потому что человек смотрит: "Ага, сервис, ага, он должен быть где-то инициализирован данными, как же его инициализировать или как протянуть инициализированный, оо, да это синглтон"

И да, интерфейсы обычно выглядят в этом случае как "оверхед".

artcraft
27.12.2011, 22:55
да тут помогут нэймспейсы

HardCoder
27.12.2011, 23:04
Ну, в моем случае нужен public. Так как доступ должен осуществлятся из других пакетов. Но и если бы это было не так, компилятор не позволит поставить разные модификаторы на гет и сет.
Можно и держать в памяти, но я люблю писать код, будучи уверенным, что непредвиденных обстоятельств не должно случится. Звучит очень громко :). По крайней мере стремлюсь к тому чтобы такое не случилось. Ведь после 1000 строк - эта штука вылетает из головы, и нечаянно можно изменить то что изменяться не должно. Ведь согласитесь, бывают же очень большие запутанные проэкты. А потом пол дня поиска зарытой собаки...
По поводу синглтонов - согласен. Лично мне и в голову бы не пришло написать new MySingletone(); потому что знаю что он синглтон. И при обращении MySingletone.instance - знаю что если экземпляра нет - он создастся, если сть - не создастся.

Добавлено через 1 минуту
А вот про пространства имен надо бы почитать. Никогда не представлял что это такое. Ладно, раз помогут - почитаю... Спасибо всем за внимание.

alatar
27.12.2011, 23:48
Сделайте два интерфейса, один с геттером, другой с сеттером (ну или с обоими) и где необходимо используйте интерфейсы.

Добавлено через 3 минуты
Но и если бы это было не так, компилятор не позволит поставить разные модификаторы на гет и сет.
Можно установить разные неймспейсы, но удобства это не добавляет.

HardCoder
28.12.2011, 00:16
А что делать, если мой класс CL1 унаследован от DisplayObject? var cl1Instance:ICL1 = new CL1();
this.addChild(cl1Instance);Выдает что нельзя преобразовать ICL1 в DisplayObject. А вот такая конструкция работает:var cl1Instance:CL1 = new CL1();
this.addChild(cl1Instance);

expl
28.12.2011, 00:59
Но и если бы это было не так, компилятор не позволит поставить разные модификаторы на гет и сет.
Никто не запрещает написать установочный сеттер в стиле Java:

internal function setValue(value:ValueType):void
{
_value = value;
}
public function get value():ValueType
{
return _value;
}



А что делать, если мой класс CL1 унаследован от DisplayObject?
Код AS3:
var cl1Instance:ICL1 = new CL1();
this.addChild(cl1Instance);

Тут был дискусс на 4 страницы по поводу DisplayObject и интерфейсов:
http://www.flasher.ru/forum/showthread.php?t=171621

alatar
28.12.2011, 01:46
var cl1Instance:ICL1 = new CL1();
his.addChild(cl1Instance as DisplayObject);

HardCoder
28.12.2011, 10:03
Спасибо, как просто! :)