Страница 1 из 1

Инкапсуляция стейтов в State Pattern.

СообщениеДобавлено: 14 июн 2019, 17:38
GospelOfMyHeart
Здравствуйте, возникла проблема. Никак не могу сообразить, как лучше всего скрыть от кода стейты. Как бы, мне надо хранить 3 состояния, что бы по надобности их вытягивать. Пришел к использованию static. Но статик так просто не инициализировать извне. Возможно стоит использовать какой-то еще класс, для того, что бы хранить классы состояния, что бы не пересоздавать их каждый раз?
Синтаксис:
Используется csharp
public class BaseState
{
    static BaseState idle;
    static BaseState running;
    static BaseState inAirState;

    public static BaseState IdleState
    {
        get
        {
            if (idle == null)
            {
                idle = new CharacterIdleState();
            }
            return idle;
        }
        set
        {
            idle = value;
        }

    }
    public static BaseState RunningState
    {
        get
        {
            if (running == null)
            {
                running = new CharacterRunningState();
            }
            return running;
        }
        set
        {
            running = value;
        }
    }
    public static BaseState InAirState
    {
        get
        {
            if(inAirState == null)
            {
                inAirState = new CharacterRunningState();
            }
            return inAirState;
        }
        set
        {
            running = value;
        }
    }
}

Re: Инкапсуляция стейтов в State Pattern.

СообщениеДобавлено: 14 июн 2019, 17:54
AngryCat
Какая задача этих стейтов?

Re: Инкапсуляция стейтов в State Pattern.

СообщениеДобавлено: 14 июн 2019, 18:21
GospelOfMyHeart
AngryCat писал(а):Какая задача этих стейтов?

Типичная. Передвижение персонажа, в зависимости от его состояния. Просто, что бы не создавать каждый раз новый стейт, хочу хранить их где-то. Но в переспективе, у каждого подкласа будет свой конструктор со своими параметрами

Re: Инкапсуляция стейтов в State Pattern.

СообщениеДобавлено: 14 июн 2019, 18:42
1max1
Но статик так просто не инициализировать извне.

Подробней. Почему не получается сделать просто:
Синтаксис:
Используется csharp
public static BaseState idle = new CharacterIdleState();

???

Re: Инкапсуляция стейтов в State Pattern.

СообщениеДобавлено: 14 июн 2019, 19:11
seaman
Если они не меняются рантайм - может в ScriptableObject? Как тут:
https://unity3d.com/ru/learn/tutorials/ ... te-pattern

Re: Инкапсуляция стейтов в State Pattern.

СообщениеДобавлено: 14 июн 2019, 19:52
~AvA~
GospelOfMyHeart писал(а): Никак не могу сообразить, как лучше всего скрыть от кода стейты. Как бы, мне надо хранить 3 состояния, что бы по надобности их вытягивать. Пришел к использованию static.

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

Re: Инкапсуляция стейтов в State Pattern.

СообщениеДобавлено: 19 июн 2019, 14:24
GospelOfMyHeart
1max1 писал(а):
Но статик так просто не инициализировать извне.

Подробней. Почему не получается сделать просто:
Синтаксис:
Используется csharp
public static BaseState idle = new CharacterIdleState();

???

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