PDA

Просмотр полной версии : Область видимости в классах


ir73
15.02.2006, 21:15
Интереует, как быть в такой ситуации. Быть может у меня подход неверный?
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 классе. Как быть тут?

Antares
15.02.2006, 22:24
Ответь мне на всего один вопрос: на что указывает this внутри метода check1Pressed?

meiciuc
15.02.2006, 22:41
Насчет подхода не знаю, верный или не верный - все зависит от цели, (плюс я лично никогда не наследую от мувиклипа - намного гибче структура получается), но то что в коде есть ошибки - факт.
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 перед объявлениями переменных поставить.

ir73
15.02.2006, 23:04
Господа, все равно не допетрю:
Антарес, this указывает на chk1, а doAction это как раз и есть его метод. Вроде все верно.

meiciuc, на сколько я знаю, экземпляр класса == обьект.
3. да, там есть var, писал по памяти код
4. нет, checkBox мой собственный

Antares
15.02.2006, 23:12
Антарес, this указывает на chk1, а doAction это как раз и есть его метод. Вроде все верно.

Тогда зачем использовать Delegate? Что вообще делает Delegate?

ir73
15.02.2006, 23:14
делегейт запускает функцию от лица обьекта-первго параметра. В данном случае он для наглядности и тут не нужен. Но ведь с ним одно и тоже что и без него (в моем случае) , я так понимаю?

Antares
15.02.2006, 23:20
Так раз функция исполняется, как ты сказал, "от лица объекта чекбокс", то как же ты хочешь достучаться до private-члена другого класса?

ir73
15.02.2006, 23:43
верно, но как я и написал в первом посте, с public тоже не работает

Antares
15.02.2006, 23:50
Потрейси метод и немного подумай, ответ близко.

ir73
16.02.2006, 00:04
да без понятия, застрял.

в методе поставил

for (var i in this) {
trace(this[i] + " : " + i);
}

выводит что есть метод onPress.

ir73
16.02.2006, 00:13
а если так написать :
public function chek1Pressed() {
this._parent.chk1.doAction(true);

}
}
то прокатывает, но ведь так - коряво!

meiciuc
16.02.2006, 03:10
вот-вот, я всегда говорил, что все не наглядно, когда наследуешь от мувиклипа. Твой последний пример "прокатывания" должен тебе показать, что this указывает на экземпляр класса (да экземпляр класса == объект, так же как и человет == объект, и его органы, тоже отдельные объекты. Так и твой чекбокс объект, да не тот). А твой дуАктион срабатывает тогда, когда ты его вызываешь прямо от чекбокса. Посмотри внимательней. А этот парент показывает, что хоть чекбокс и является объектом класса OptionWindow(согласно объявлению), но в то же время (если рассматривать ситуацию со стороны мувиков, а не классов), он будто бы является равноценным объектом того же OptionWindow. Т.е. у них общий парент( иначе ты бы не смог обратиться к нему по этому пути this._parent.chk1.doAction(true);)

public function chek1Pressed() {
this._parent.chk1.doAction(true);

}
}


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

Нужен ли делегат в данном конкретном случае, не знаю, по вышеописанной причине. Могу сказать лишь одно, что, когда создаешь классы, не наследуя их от мувиклипа, без делегата не обойтись. Почитайте на макромедии по теме - у них там обработчики событий теряют ссылку на объкт класса. Чтоб эту дыру закрыть и придумали делегат. Кстати в АС3 они эту проблему решили и делегатов там не будет.

Antares
16.02.2006, 04:23
Это не дыра, это известная и никогда не скрывавшаяся особенность языка. И делегейты в АС3 есть, просто по-умолчанию ссылка сохраняется на экземпляр класса, а не на член.

ir73
16.02.2006, 10:18
и что вы мне посоветуете в моем случае? как будет првильнее всего?

meiciuc
16.02.2006, 10:55
для antares - конечно делегаты есть в АС3, я просто неверно выразился - они есть даже в ява и си :). А называть потерю ссылки можно и особенностью языка, так же как и родившегося без руки можно назвать особенным. В любом случае эта особенность не очень удобна, не зря парни из макромедии от нее избавляются.

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

Antares
16.02.2006, 11:37
В случае, когда членами класса будут компоненты, наследуешь от UIComponent и используешь createChild / createClassObject на лету. Все.

ir73
16.02.2006, 12:01
у меня CheckBox экстендит мувик, не UIComponent