Предложите способ проектирования нескольких классов - PullRequest
0 голосов
/ 09 июня 2010

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

Каждый корабль создается следующим образом:

  1. Создать сущность
  2. Добавить пространственный
  3. Добавить рендереры
  4. Добавить другие компоненты .... ...... п. инициация корабля

Итак, что я пытаюсь сделать:

1) Создание суперкласса StarShip для хранения HP (как у каждого корабля), хранения в пространстве (по той же причине)

2) Создать унаследованный класс для любого другого корабля ... (Он будет содержать визуализатор - (отвечает за отображение части), оружие, набор анимаций) и т. Д.

Что вы думаете о таком способе композиции? Может быть, лучше поместить все в суперкласс, а затем просто создавать экземпляры, используя длинные, длинные и длинные конструкторы, такие как:

StarShip (hp: HP, анимация: DICT, оружие: Weapon, ....)

Нужен совет

1 Ответ

0 голосов
/ 09 июня 2010

Я думаю Абстрактная фабрика может решить это

вот пример того, как использовать два ремесленных класса на основе абстрактного StarCraft

 class StarCraft
{
    private HP hp;
    private Spatial spatial;
    public StarCraft(HP hp,Spatial spatial)
    {
        // store HP and Spatial for your needs in base class
        this.hp = hp;
        this.spatial = spatial;
    }
    // must be implemented in derived classes
    public abstract void Init();
}

internal class TurboStarCraft : StarCraft
{
    private Render render;
    private OtherComponents otherComponents;
    public TurboStarCraft(HP hp, Spatial spatial,Render render, OtherComponents otherComponents) : base(hp, spatial)
    {
        this.render = render;
        this.otherComponents = otherComponents;
    }
    public void Init()
    {
        // init somehow;
    }
}
internal class SuperStarCraft : StarCraft
{
    private Render render;
    private OtherComponents otherComponents;
    public SuperStarCraft(HP hp, Spatial spatial,Render render, OtherComponents otherComponents) : base(hp, spatial)
    {
        this.render = render;
        this.otherComponents = otherComponents;
    }
    public void Init()
    {
        // init somehow;
    }
}

class StarCraftFacroty
{
    public StarCraft Create(const int craftType)
    {
        if(craftType == SUPERCRAFT)
        {
            return new SuperStarCraft(hp, spatial, otherCompenents);
        }
        if(craftType == TURBOCRAFT)
        {
            return new TurboStarCraft(hp, spatial, otherCompenents);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...