Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   вопросы по обучению основам AS3.0 (http://www.flasher.ru/forum/showthread.php?t=203505)

nelco 27.09.2013 04:51

вопросы по обучению основам AS3.0
 
здравствуйте, читаю книгу по ActionScript, но в ней некоторые моменты непонятны, помогите, пожалуйста, разобраться... вот пример: есть класс TestCode:

Код AS3:

 
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
                        }
                }
        }
 
}

при создании в другом классе объекта с типом данных этого класса
Код AS3:

private var _testCode:TestCode = new TestCode();

и обращения к методу getCount
Код AS3:

trace (_testCode.getCount);

выдается в output почему-то function Function() {}, хотя я думал, что должно выдаваться значение _count = 0, ведь функция getCount возвращает именно _сount... подскажите что не так тут, а то не знаю даже как искать дальше ответ! заранее спасибо! :)

RonEXI 27.09.2013 06:21

Код AS3:

trace (_testCode.getCount());


caseyryan 27.09.2013 08:22

nelco, функции (всегда!) вызываются со скобками ()
без скобок возможно обращение к переменным, константам, и нативным геттерам/сеттерам as3

То, что используется у вас - простые методы, не нативные геттеры и сеттеры 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
        }
}

и обращаться в этом случае можно будет так:
Код AS3:

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

спасибо за ответы, всё стало понятно, значит это не были ещё геттер и сеттер... теперь переписал код в такой вид
Код AS3:

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
                        }
                }
        }
 
}

теперь при создании экземпляра этого класса
Код AS3:

var _testcode:TestCode = new Testcode

в другом классе, если хочу поменять оттуда значение _count этого класса, то надо же обращаться к СЕТТЕРУ public function set сount(value:uint), тут непонятно опять, почему надо писать
Код AS3:

_testCode.count = 111

ведь функция принимает параметры в скобках, думал, надо писать
Код AS3:

_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

Цитата:

тут непонятно опять, почему надо писать
При использовании сеттера, логика вызова следующая:
Код AS3:

_testCode.count = 111;
//Это аналогично вызову
_testCode.setCount(111);

Цитата:

а так не работает, почему не передаётся значение в скобках? потому что это уже не функция что ли? :\
Функция, просто синтаксис вызова этой функции другой.

Например если у вас есть функция getCount() следующего вида:
Код AS3:

public function getCount():int
{
    return _count;
}

То обращаясь к этой функции по-разному, мы получим разный результат:
Код AS3:

...
trace(_testObject.getCount)// Имеем ссылку на функцию
trace(_testObject.getCount()); // Имеем конкретное значение _count
...

в случае с геттерами ссылки на функцию нам не дают, и вызов выглядит как обращение к самой переменной. Рассматривайте это как прослойку между инкапсулированными данными и внешним миром.


Часовой пояс GMT +4, время: 16:20.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.