Просмотр полной версии : вопросы по обучению основам AS3.0
здравствуйте, читаю книгу по ActionScript, но в ней некоторые моменты непонятны, помогите, пожалуйста, разобраться... вот пример: есть класс TestCode:
package
{
public class TestCode
{
public var _count:uint;
public function TestCode()
{
_count = 0;
}
public function getCount():uint {
return _count;
}
public function setCount(value:uint):void {
if (value < 100) {
_count = value;
}
else {
throw Error
}
}
}
}
при создании в другом классе объекта с типом данных этого класса private var _testCode:TestCode = new TestCode(); и обращения к методу getCount trace (_testCode.getCount); выдается в output почему-то function Function() {}, хотя я думал, что должно выдаваться значение _count = 0, ведь функция getCount возвращает именно _сount... подскажите что не так тут, а то не знаю даже как искать дальше ответ! заранее спасибо! :)
trace (_testCode.getCount());
caseyryan
27.09.2013, 08:22
nelco, функции (всегда!) вызываются со скобками ()
без скобок возможно обращение к переменным, константам, и нативным геттерам/сеттерам as3
То, что используется у вас - простые методы, не нативные геттеры и сеттеры as3. Чтобы все было "по феншую" можно переписать код так:
public function get count():uint {
return _count;
}
public function set count(value:uint):void {
if (value < 100) {
_count = value;
}
else {
throw new Error("ошибка"); // не забываем про директиву new
}
}
и обращаться в этом случае можно будет так:
trace (_testCode.count); // без скобок
Fogflasher
27.09.2013, 09:40
Вопрос в догонку: а нафига вообще были придуманы эти get и set?
Ведь, имхо, удобнее сделать все обычными функциями. И понятнее.
А тут надо переключаться на понимание того, что это гет-хренотень, и что её надо как переменную использовать. В чем выигрыш то?
FlashRus
27.09.2013, 09:45
http://ru.wikipedia.org/wiki/Свойство_(программирование)
caseyryan
27.09.2013, 10:07
А тут надо переключаться на понимание того, что это гет-хренотень, и что её надо как переменную использовать. В чем выигрыш то?
Особенности языка. Инкапсуляция свойств, вместо использования публичных переменных. Штука, кстати, достаточно удобная. Внешне как простая public переменная, а внутри можно ввести проверку задаваемого и возвращаемого значений, плюс еще какой-то дополнительный код выполнить
Лично мне нравится. Да и многим тоже. А для тех, кому не нравится, всегда есть выбор, использовать простые методы, или нативные геттеры/сеттеры. И то и то вполне допустимо, и плохим тоном не является.
спасибо за ответы, всё стало понятно, значит это не были ещё геттер и сеттер... теперь переписал код в такой вид package
{
public class TestCode
{
public var _count:uint;
public function TestCode()
{
_count = 0;
}
public function get сount():uint {
return _count;
}
public function set сount(value:uint):void {
if (value < 100) {
_count = value;
}
else {
throw Error
}
}
}
}
теперь при создании экземпляра этого класса var _testcode:TestCode = new Testcode в другом классе, если хочу поменять оттуда значение _count этого класса, то надо же обращаться к СЕТТЕРУ public function set сount(value:uint), тут непонятно опять, почему надо писать _testCode.count = 111 ведь функция принимает параметры в скобках, думал, надо писать _testCode.count(111), а так не работает, почему не передаётся значение в скобках? потому что это уже не функция что ли? :\
Fogflasher
27.09.2013, 11:33
nelco, ну вот как выше было отмечено, и насколько я понимаю концепцию геттеров и сеттеров, как раз смысл в том и заключается, чтобы "превратить функцию в переменную".
Поэтому, скобки вам не нужны, вы просто присваиваете значение, "словно это свойство".
Хотя, я могу ошибаться, подождем ответа профи.
Вам уже ответили выше, что это особенность языка.Конечно get/set методы являются функциями, но обращение к ним происходит как к переменным.Не стоит пытаться понять почему так, а лучше просто запомнить, что с get/set методами нужно работать именно так или же создавать свои методы, как Вы и делали только уже не забывайте про скобки getCount(), так как это не get метод, а Ваш пользовательский и не важно то что Вы в нем написали get.
KumoKairo
27.09.2013, 12:27
тут непонятно опять, почему надо писать
При использовании сеттера, логика вызова следующая:
_testCode.count = 111;
//Это аналогично вызову
_testCode.setCount(111);
а так не работает, почему не передаётся значение в скобках? потому что это уже не функция что ли? :\
Функция, просто синтаксис вызова этой функции другой.
Например если у вас есть функция getCount() следующего вида:
public function getCount():int
{
return _count;
}
То обращаясь к этой функции по-разному, мы получим разный результат:
...
trace(_testObject.getCount); // Имеем ссылку на функцию
trace(_testObject.getCount()); // Имеем конкретное значение _count
...
в случае с геттерами ссылки на функцию нам не дают, и вызов выглядит как обращение к самой переменной. Рассматривайте это как прослойку между инкапсулированными данными и внешним миром.
caseyryan
27.09.2013, 14:06
nelco, у вас в коде есть ошибка, на которую я указал в коментарии, но это, cудя по всему осталось незамеченным
вот тут:
throw Error
Забыто слово new и так же нет скобок с аргументами. Плюс еще конец строки надо обозначать точкой с запятой
throw new Error("значение не соответствует разрешенному");
Akopalipsis
27.09.2013, 14:14
nelco Вам нужно уяснить лишь то, что геттеры и сеттеры - необходимо использовать. я много раз откладывал книгу и с ворчаньем ходил и говорил, что язык какие то глупые придумали. Конечно это не так. Пока Вы просто рисуете и восхищаетесь квадратикам сделанным при помощи кода, в сеттерах и геттерах смысла нет. Но Вы лучше сразу делайте правильно, с ними, чтобы потом было легче, а если и потом останутся вопросы, спрашивайте. Лично я не один вопрос про них задавал.)
И приготовьтесь познать интерфейсы))) Они вообще могут человека сума свести.
Книжки это прекрасно, но работа над проектом в коллективе проф. флешеров может сэкономить Ваше время, а у них естественно отнять:)
Подскажите человеку, где ему найти команду проф флешеров и чтобы они при этом захотели с ним возится и тащить за собой как баласт.
Вот поучительная история
http://www.youtube.com/watch?v=OzqbNyD83RU
Во избежание офтопа напоминаю, что у ТС был конкретный вопрос.
nelco, на всякий случай сообщу: вам следует учесть правила форума - "один вопрос - одна тема", и озаглавливать темы сообразно конкретным вопросам.
nelco, у вас в коде есть ошибка, на которую я указал в коментарии, но это, мудя по всему осталось незамеченным
вот тут:
throw Error
Забыто слово new и так же нет скобок с аргументами. Плюс еще конец строки надо обозначать точкой с запятой
throw new Error("значение не соответствует разрешенному");
А где тут ошибка? throw (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/statements.html#throw) можно что угодно сделать.
caseyryan
28.09.2013, 10:25
А где тут ошибка? throw можно что угодно сделать.
1) Этот throw просто выкинет название класса Error. Хотя очевидно, что нужно другое. С таким же успехом можно и вот так написать throw "Error"; Автор написал здесь без new, забыв про это, и в другом случае тоже будет пропускать слово new, а потом думать в чем же ошибка? Почему не работает? Сам на эти грабли когда-то наступал.
2) Строка не завершена точкой с запятой. Хоть компилятор ас3 это в большинстве случаев ошибкой не посчитает, но такую привычку лучше не вырабатывать. Большинство других языков этого не позволяют
большое спасибо за ответы! насчёт new не совсем понятно для чего писать new? но, думаю, разберусь по ходу дела, главное, что понял, что это имеет значение и важно, по-видимому... теперь вот разбираюсь с функцией override, создал 2 класса, 1-й SUPERCLASS: package
{
public class SuperClass
{
public function SuperClass()
{
}
public function toString():String {
return ("SuperClass.toString() - вызов текста из SuperClass")
}
}
}
второй класс - SUBCLASS, который расширяет SUPERCLASS:
package
{
public class SubClass extends SuperClass
{
public function SubClass()
{
}
override public function toString():String {
return ("SubClass.toString() - overridden");
}
}
}
получается, что override можно писать только в классе, который расширяет superclass? или если я создаю например ещё 3-й класс и в нём создаю объект private var _subClass:SubClass = new SubClass(); то можно ли из этого 3-го класса делать тоже override для какой-нибудь из функций SubClass или SuperClass? или override делается только в расширяющем классе?
Добавлено через 9 минут
Babylon - насчёт работы в коллективе - бесспорно - это самый лучший вариант, я так и пытаюсь делать, нашёл 2-х программистов на этом форуме, они мне помогают, точнее они всё и делают, создают весь код, а я создаю структуру и всякие тонкости продумываю... сейчас просто уехал по работе на неделю в другой город я, пока вся работа встала, но вот тут решил взять с собой книжку, чтобы тоже учиться самому, пока не вернусь опять работать с ними... вот захожу тут через сотку, чтобы задать вопрос на flasher.ru :) спасибо, что отвечаете! большое! насчёт проекта - мы его делаем уже пол года, ещё конца даже примерно не видно, так что если кому-то из Вас нужна работа удалённая или в будущем будет нужна, то пишите, в будущем будет много задач (в планах - их нескончаемое множество) :( скоро возьму у спонсоров деньги на оплату программистам, чтобы побыстрее всё закончить, а то 2 человека - не справляются, слишком медленно идёт всё...
Добавлено через 16 минут
mooncar - но так ведь будет засоряться форум, если каждый вопрос писать в отдельную тему? :\
caseyryan
28.09.2013, 19:34
насчёт new не совсем понятно для чего писать new?
new - это директива, при помощи которой создаются новые экземпляры классов. Без нее создать новый экземпляр невозможно. В том числе и невозможно создать новый экземпляр класса Error
mooncar - но так ведь будет засоряться форум, если каждый вопрос писать в отдельную тему? :\
Я б сказал, как раз наоборот. Засоряться он будет если валить все в одну тему. Не стоит забывать, что большинство людей ищут ответы на свои вопросы через поисковики, и им будет сложно искать ответ в темах, где навалена целая куча вопросов и есть куча страниц.
А движку форума все равно сколько тем будет создано. Для него - это всего лишь дополнительная запись в базе.
то можно ли из этого 3-го класса делать тоже override для какой-нибудь из функций SubClass или SuperClass? или override делается только в расширяющем классе?
Естественно перезаписать (override) можно только те методы, которые уже созданы в суперклассах. Нельзя перезаписать метод субкласса, так как суперкласс не знает ничего о тех классах, которые его будут расширять.
А вот что касается суперклассов, то длинна цепочки наследования значения не имеет. Перезаписать метод любого из суперклассов можно, если он не помечен как final
mooncar - но так ведь будет засоряться форум, если каждый вопрос писать в отдельную тему? :\
Нет. Так форум будет работать не только на вас, но и на всех. Для тех кто столкнется с аналогичной трудностью, будет упрощен поиск ее решения или как минимум, обсуждения решения. Здесь нет тем "имени меня", здесь есть темы "имени" конкретной проблемы, это база знаний.
Нельзя переписать в суперклассе, а в субклассе субкласса можно.
mooncar, хорошо, понял, буду создавать новые темы... спасибо за ответы, ещё раз...
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.