PDA

Просмотр полной версии : вопросы по обучению основам AS3.0


nelco
27.09.2013, 04:51
здравствуйте, читаю книгу по 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... подскажите что не так тут, а то не знаю даже как искать дальше ответ! заранее спасибо! :)

RonEXI
27.09.2013, 06:21
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 переменная, а внутри можно ввести проверку задаваемого и возвращаемого значений, плюс еще какой-то дополнительный код выполнить
Лично мне нравится. Да и многим тоже. А для тех, кому не нравится, всегда есть выбор, использовать простые методы, или нативные геттеры/сеттеры. И то и то вполне допустимо, и плохим тоном не является.

nelco
27.09.2013, 11:16
спасибо за ответы, всё стало понятно, значит это не были ещё геттер и сеттер... теперь переписал код в такой вид 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, ну вот как выше было отмечено, и насколько я понимаю концепцию геттеров и сеттеров, как раз смысл в том и заключается, чтобы "превратить функцию в переменную".

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

belv
27.09.2013, 11:34
Вам уже ответили выше, что это особенность языка.Конечно 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 Вам нужно уяснить лишь то, что геттеры и сеттеры - необходимо использовать. я много раз откладывал книгу и с ворчаньем ходил и говорил, что язык какие то глупые придумали. Конечно это не так. Пока Вы просто рисуете и восхищаетесь квадратикам сделанным при помощи кода, в сеттерах и геттерах смысла нет. Но Вы лучше сразу делайте правильно, с ними, чтобы потом было легче, а если и потом останутся вопросы, спрашивайте. Лично я не один вопрос про них задавал.)
И приготовьтесь познать интерфейсы))) Они вообще могут человека сума свести.

Babylon
27.09.2013, 14:40
Книжки это прекрасно, но работа над проектом в коллективе проф. флешеров может сэкономить Ваше время, а у них естественно отнять:)

belv
27.09.2013, 14:57
Подскажите человеку, где ему найти команду проф флешеров и чтобы они при этом захотели с ним возится и тащить за собой как баласт.

Babylon
27.09.2013, 15:25
Вот поучительная история
http://www.youtube.com/watch?v=OzqbNyD83RU

mooncar
27.09.2013, 15:37
Во избежание офтопа напоминаю, что у ТС был конкретный вопрос.
nelco, на всякий случай сообщу: вам следует учесть правила форума - "один вопрос - одна тема", и озаглавливать темы сообразно конкретным вопросам.

dimarik
27.09.2013, 23:04
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 это в большинстве случаев ошибкой не посчитает, но такую привычку лучше не вырабатывать. Большинство других языков этого не позволяют

nelco
28.09.2013, 16:11
большое спасибо за ответы! насчёт 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
28.09.2013, 20:09
mooncar - но так ведь будет засоряться форум, если каждый вопрос писать в отдельную тему? :\
Нет. Так форум будет работать не только на вас, но и на всех. Для тех кто столкнется с аналогичной трудностью, будет упрощен поиск ее решения или как минимум, обсуждения решения. Здесь нет тем "имени меня", здесь есть темы "имени" конкретной проблемы, это база знаний.

Babylon
28.09.2013, 21:37
Нельзя переписать в суперклассе, а в субклассе субкласса можно.

nelco
30.09.2013, 04:31
mooncar, хорошо, понял, буду создавать новые темы... спасибо за ответы, ещё раз...