Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопрос про get и set (http://www.flasher.ru/forum/showthread.php?t=210430)

DenDobriy 14.03.2015 01:01

Вопрос про get и set
 
Теперь когда более-менее ясно про организацию классов, хотелось бы понять как между ними делать взаимодействие.
Я вроде правильно написал getter и setter?
Код AS3:

public class MainHiro extends GG
        {
                private var fnX:int= 0;
                private var fnY:int= 0;
 
                public function get get_set_gg_x():Number
                {
                        return fnX;
                }
                public function get get_set_gg_y():Number
                {
                        return fnY;
                }
                public function set get_set_gg_x(xy_mouse:Number)
                {
                        fnX =xy_mouse;
                }
                public function set get_set_gg_y(xy_mouse:Number)
                {
                        fnY =xy_mouse;
                }
 
 
                public function MainHiro()
                {
                        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
                }
//
private function fnGetXY(event:MouseEvent):void
                {
                        get_set_gg_x=stage.mouseX;
                        get_set_gg_y=stage.mouseY;
                }

В главном классе я не могу извлечь данные из него.
Код AS3:

public function Main()
                {
                        this.addEventListener(Event.ENTER_FRAME,seting);
                        var gg:MainHiro = new MainHiro();
                        //var bg_move:MoveBg= new MoveBg();
                        gg.x = 200;
                        gg.y = 200;
                        addChild(gg);
                        fn_bg_move();
                        trace(gg.get_set_gg_x);// Выводит 0
                }

Как это сделать?

КорДум 14.03.2015 02:07

В момент
Код AS3:

trace(gg.get_set_gg_x);

хендлер MainHiro#fnGetXY еще не выполнился, поэтому fnX и fnY имеют заданные дефолтные значения
Код AS3:

private var fnX:int= 0;
private var fnY:int= 0;


ZackMercury 14.03.2015 08:35

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

Например, если вы делаете игру про инопланетян, то вам нужен класс Alien, Spaceship, Space.
В классе Alien приватные поля _health:int, _readyState:int, _dead:Boolean, и методы
getHealth(), isDead(), getReadyState() - это полоса готовности пришельца, допустим, к стрельбе или удару, подобно кончающимся силам живого человека, hit(), takeDamage(), - эти для ударов других пришельцев нашим, тоесть для ударов других экземпляров или наследников класса Alien.

DenDobriy 14.03.2015 11:47

ZackMercury, спасибо за конвенции. Я их не пропустил

dimarik 17.03.2015 21:18

Цитата:

Сообщение от ZackMercury (Сообщение 1180040)
getHealth(), getReadyState() ... takeDamage()

Если это не акцессоры, то я сильно против таких методов, которые суть акцессоры. Если это акцессоры, то очень фигово называются.

Негативное мнение вызвано необходимостью отладки и поддержания проекта. В хороших IDE корректно покажется текущее значение геттера с произвольной цепочкой вложенности просто при наведении курсора мыши на имя вызываемого геттера в редакторе.

ZackMercury 17.03.2015 21:53

Можно и геттерами, можно и простыми методами. Кажется, в Муке было что-то нехорошее сказано в пользу геттеров и сеттеров, вот я и использую методы.

caseyryan 18.03.2015 12:18

Цитата:

Если это акцессоры, то очень фигово называются.
Чем фигово? Тем, что написаны не по стандартам as3?
В ас3 геттеры / сеттеры не идеальны. Они хороши, если надо в сеттере передать всего один параметр. А если больше? Не всегда удобно

ZackMercury 18.03.2015 12:32

caseyryan, в аксессоры вряд ли придётся передавать более, чем 1 параметр. Для этого есть обычные методы.
В целом, я согласен с dimarik.

caseyryan 18.03.2015 18:53

Можно например сделать setPosition(x:int, y:int), или setSize(width:int, height:int). Но сеттеры и геттеры должны писаться по единому стандарту. Если есть getHealth(), то сеттер должен быть setHealth(value:int)
В джаве это стандарт. АС3 конечно не джава, но это говорит о том, что стандарт все-таки вполне нормальный и общепринятый. Ничего плохого в этом нет. Плохо - это когда название метода вообще не информативно
Цитата:

Для этого есть обычные методы.
Это и есть обычные методы

ZackMercury 18.03.2015 20:43

По вашему getPosition должен возвращать либо экземпляр объекта, либо объект класса Point, а getSize - объект класса Rectangle, так штоли?

Как сделать setSize и getSize с двумя параметрами так, чтобы не было лишних действий/затрат памяти?
Всё-таки создание экземпляра Point довольно затратная операция, а получать размеры скорее всего придётся в каждом кадре.

Вот именно, два параметра - значит нет getТоЖеСамое, либо он затратный.


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

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