Просмотр полной версии : Область видимости в классах
Интереует, как быть в такой ситуации. Быть может у меня подход неверный?
import Checkbox;
import mx.utils.Delegate;
class OptionsWindow extends MovieCLip {
private chk1:CheckBox;
private chk2:CheckBox;
public function OptionsWIndow() {
chk1.onPress = Delegate.create(chk1, chek1Pressed);
chk2.onPress = Delegate.create(chk2, chek2Pressed);
}
public function chek1Pressed() {
this.doAction(true);
}
public function chek2Pressed() {
this.doAction(false);
}
}
Во-первых, интересует почему нельзя что бы было как сейчас написано private chk1:CheckBox; а должно быть public chk1:CheckBox; ?
Ведь на сколько я знаю, с делегейтом можно к прайват свойствам обращаться.
Второй вопрос: почему ругается компилятор на "doAction" что мол нет такой функции? На самом деле она есть и описана в CheckBox классе. Как быть тут?
Ответь мне на всего один вопрос: на что указывает this внутри метода check1Pressed?
Насчет подхода не знаю, верный или не верный - все зависит от цели, (плюс я лично никогда не наследую от мувиклипа - намного гибче структура получается), но то что в коде есть ошибки - факт.
1. this в данном случае содержит ссылку на сам экземпляр класса, а не на его объект
public function chek1Pressed() {
this.doAction(true);//chk1.doAction(true);
}
2 а вот в строке
chk1.onPress = Delegate.create(chk1, chek1Pressed);
как раз и должен быть this, тогда функция и получит ссылку на объект.
3 не буду придираться, но имя класса случайно не это mx.controls.CheckBox
4 не плохо было бы и var перед объявлениями переменных поставить.
Господа, все равно не допетрю:
Антарес, this указывает на chk1, а doAction это как раз и есть его метод. Вроде все верно.
meiciuc, на сколько я знаю, экземпляр класса == обьект.
3. да, там есть var, писал по памяти код
4. нет, checkBox мой собственный
Антарес, this указывает на chk1, а doAction это как раз и есть его метод. Вроде все верно.
Тогда зачем использовать Delegate? Что вообще делает Delegate?
делегейт запускает функцию от лица обьекта-первго параметра. В данном случае он для наглядности и тут не нужен. Но ведь с ним одно и тоже что и без него (в моем случае) , я так понимаю?
Так раз функция исполняется, как ты сказал, "от лица объекта чекбокс", то как же ты хочешь достучаться до private-члена другого класса?
верно, но как я и написал в первом посте, с public тоже не работает
Потрейси метод и немного подумай, ответ близко.
да без понятия, застрял.
в методе поставил
for (var i in this) {
trace(this[i] + " : " + i);
}
выводит что есть метод onPress.
а если так написать :
public function chek1Pressed() {
this._parent.chk1.doAction(true);
}
}
то прокатывает, но ведь так - коряво!
вот-вот, я всегда говорил, что все не наглядно, когда наследуешь от мувиклипа. Твой последний пример "прокатывания" должен тебе показать, что this указывает на экземпляр класса (да экземпляр класса == объект, так же как и человет == объект, и его органы, тоже отдельные объекты. Так и твой чекбокс объект, да не тот). А твой дуАктион срабатывает тогда, когда ты его вызываешь прямо от чекбокса. Посмотри внимательней. А этот парент показывает, что хоть чекбокс и является объектом класса OptionWindow(согласно объявлению), но в то же время (если рассматривать ситуацию со стороны мувиков, а не классов), он будто бы является равноценным объектом того же OptionWindow. Т.е. у них общий парент( иначе ты бы не смог обратиться к нему по этому пути this._parent.chk1.doAction(true);)
public function chek1Pressed() {
this._parent.chk1.doAction(true);
}
}
Я в подобных путаницах никогда не мог разобраться до конца. Т.е да, работает, но как ты и сказал - криво.
Нужен ли делегат в данном конкретном случае, не знаю, по вышеописанной причине. Могу сказать лишь одно, что, когда создаешь классы, не наследуя их от мувиклипа, без делегата не обойтись. Почитайте на макромедии по теме - у них там обработчики событий теряют ссылку на объкт класса. Чтоб эту дыру закрыть и придумали делегат. Кстати в АС3 они эту проблему решили и делегатов там не будет.
Это не дыра, это известная и никогда не скрывавшаяся особенность языка. И делегейты в АС3 есть, просто по-умолчанию ссылка сохраняется на экземпляр класса, а не на член.
и что вы мне посоветуете в моем случае? как будет првильнее всего?
для antares - конечно делегаты есть в АС3, я просто неверно выразился - они есть даже в ява и си :). А называть потерю ссылки можно и особенностью языка, так же как и родившегося без руки можно назвать особенным. В любом случае эта особенность не очень удобна, не зря парни из макромедии от нее избавляются.
для ir73 - на мой взгляд, самое неблагодарное дело, давать советы - у каждого свой подход в программировании, но тебе, мне кажется, следовало бы попрактиковаться побольше с адресацией (и с делегатами). Плюс парни, что практикуют наследование от мувиклипа, может чем помогут в организации класса.
В случае, когда членами класса будут компоненты, наследуешь от UIComponent и используешь createChild / createClassObject на лету. Все.
у меня CheckBox экстендит мувик, не UIComponent
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.