C# - Определите, какой класс объект должен использовать при создании экземпляра? - PullRequest
0 голосов
/ 22 января 2020

У меня есть 2 класса: Entity и Control.

Entity:

public class Entity
{

   public float Rotate {get; private set;}

   readonly Control m_Control

   public Entity(float rot)
   {
     Rotate = rot;
     m_control = new Control();
   }

    public void Update(float time)
    {

            switch (m_control.Rotating())
            {
                case Control.Rotator.Right:
                    Rotate += time * 1.5f;
                    break;
                case Control.Rotator.Left:
                    Rotate -= time * 1.5f;
                    break;
                case Control.Rotator.Still:
                    break;
                default:
                    break;          
            }
     }



}

Control:

public class Control
{
        private Random rnd = new Random();
        private int _randomTurn;

        public enum Rotator
        {
            Still,
            Right,
            Left
        }

        public Control()
        {
            TimerSetup(); // Initialize timer for Entity
        }

 public Rotator Rotating()
        {

                switch(_randomTurn)
                {
                    case 1:
                        return Rotator.Right;
                    case 2:
                        return Rotator.Left;
                    default:
                        return Rotator.Still;
                }

            }

 private void TimerSetup()
 {
            DispatcherTimer dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(GameTickTimer_Tick);
            dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
            dispatcherTimer.Start();
 }


 private void GameTickTimer_Tick(object sender, EventArgs e)
 {
     RandomTurn();
 }


 private void RandomTurn() 
 {
    _randomTurn = rnd.Next(1, 4);
 }


}

По сути, я хочу сделать класс 'Control' базовым классом и создать два подкласса: PlayerControl и AIControl. В настоящее время как управляющие входы Игрока, так и управляющие входы AI обрабатываются в одном классе Control.

Моя дилемма в том, как в классе Entity определить, какой класс Control будет использовать Entity?

Класс Entity в настоящее время назначает класс Control следующим образом:

readonly Control m_Control

public Entity(float rot)
   {
     Rotate = rot;
     m_control = new Control();
   }

Я создаю несколько экземпляров классов Entity в другом классе следующим образом:

public class Environment
{

readonly Entity m_entity;
readonly Entity m_entity2;

public Environment()
{
   m_entity = new Entity(90.0f);
   m_entity2 = new Entity(180.0f);
}

Есть ли способ определить, какой элемент управления подкласс сущность будет использовать при ее создании?

Ответы [ 2 ]

1 голос
/ 22 января 2020

Просто передайте свой экземпляр Control через конструктор. Ваш класс Entity будет выглядеть следующим образом:

readonly Control m_Control

public Entity(float rot, Control control)
   {
     Rotate = rot;
     m_control = control;
   }

Создание переменных Entity будет выглядеть следующим образом:

m_entity = new Entity(90.0f, new PlayerControl());
m_entity2 = new Entity(180.0f, new AIControl());

Этот подход называется внедрением зависимостей. См. Например Википедия для получения более подробной информации.

0 голосов
/ 22 января 2020

Да, используйте обобщенные значения:

public class Entity<TControl> where TControl : Control, new()
{
   public float Rotate {get; private set;}

   readonly TControl m_Control;

   public Entity(float rot)
   {
       Rotate = rot;
       m_control = new TControl();
   }
}

public abstract class Control {}

public class PlayerControl : Control {}
public class AIControl : Control {}

public class Environment
{

    readonly Entity<PlayerControl> m_entity;
    readonly Entity<AIControl> m_entity2;

    public Environment()
    {
       m_entity = new Entity<PlayerControl>(90.0f);
       m_entity2 = new Entity<AIControl>(180.0f);
    }
}

Ограничения гарантируют, что тип обобщенного c получен из Control и может быть создан с использованием конструктора без параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...