Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Реализация возможности «Шаг назад» (http://www.flasher.ru/forum/showthread.php?t=177655)

Srednas 05.04.2012 12:57

Реализация возможности «Шаг назад»
 
Здравствуйте.
Хочу реализовать возможность вернуться на шаг назад/вперед в приложении.

Мысль примерно такая: есть некоторый массив, в котором ссылки на функции, и чтобы шагнуть назад/вперед, нужно просто вызвать последний элемент в массиве.
Класс Manager:
Код AS3:

 
public class Manager
[...]
private static var _forward:Vector.<Function>;
[...]
// сеттер и геттер функции из стека «вперед»
public static function set forward(f:Function):void{
                _forward.push(f);
}
public static function get forward():Function{
        return _forward[_forward.length-1];
}

Использование в другом классе:
Код AS3:

[...]
Manager.forward = _map.moveObject(mo, 0, 150, -150);
[...]

Такое использование вызывает ошибку.
Подскажите, правильная ли идея и реализация? Если нет, как можно поправить?

Genzo 05.04.2012 13:08

Код AS3:

public static function pushForward(f:Function , ... rest):void{
                _forward.push([f,rest]);
}
public static function get forward():Function{
        return _forward[_forward.length-1];
}
_map.moveObject(mo, 0, 150, -150);
Manager.pushForward( _map.moveObject , mo, 0, 150, -150);

Придется для каждой функции писать отмену.

Inet_PC 05.04.2012 13:12

У Вас не работает потому что
Код AS3:

_map.moveObject(mo, 0, 150, -150);

возвращает не функцию, а результат функции (в данном случае видимо void). Чтобы получить ссылку на функцию нужно сделать так:
Код AS3:

Manager.forward = _map.moveObject;

Теперь видно, что кроме функции нужны еще и параметры (и их количество может меняться), и тоже придется хранить. Вообще данную задачу решают с использование паттерна Command. Примерно с таким интерфейсом:
Код AS3:

package
{
        public interface ICommand
        {
                function execute():*;
                function undo():void;
                function redo();
        }
}

И в этом объекте хранится вся необходимая инф-ция чтобы выполнить/отменить какое-то минимально отменяемое действие.
А вообще поиск рулит.


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

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