Список процессов двух разных типов - PullRequest
0 голосов
/ 21 октября 2019

У меня есть два типа / классы Missile и TrackingMissile. Где TrackingMissile : Missile и TrackingMissiles переопределяют его базовый Update метод.

Ракеты Update Реализация:

void Update()

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

void Update(Vector2 target)

Затем я хочу собрать ракету с List<Missile>. Если бы это был Typescript, я бы реализовал его с объединенным типом, и во время итерации я бы сделал какое-то сопоставление с образцом.

В основном нацеливаясь на этот недопустимый код:

List<Missile> missiles = new List<Missile> {
    new Missile(...),
    new TrackingMissile(...)
};

foreach (var missile in missiles) {
    if (missile is Missile) missile.Update()
    else if (missile is TrackingMissile) missile.Update(target)
}

Здесь кажется, что это TrackingMissile как-то разыгрывается где-то или такое. Один из способов, который я мог бы сделать, - это реализовать два списка разных типов, но это желательно, так как он не поддерживается, когда я хочу реализовать больше производных от Missile.

tldr: как лучше всего поддерживатьколлекция разных типов и во время итерации запускаются разные логики в зависимости от их типа.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Я предлагаю использовать один и тот же интерфейс для всех классов ракет:

 public class Missile {
   ...
   // In case of untracking missile we ignore its target
   public virtual void Update(Vector2 target) 
     => Update();

   // No target: just moving forward
   protected void Update() {...}
 }

 public class TrackingMissile : Missile { 
   ...
   // In case of tracking missile we put target into account 
   public override void Update(Vector2 target) {...}       
 } 

Таким образом вы можете легко создавать новые типы ракет без изменения foreach логики

 public class GuidedMissile : TrackingMissile { 
   ...
   public override void Update(Vector2 target) {
     // If target has been captured by radar
     if (IsTargetCaptured(target)) 
       base.Update(target); // ... approach to the target, 
     else 
       Update();            // otherwise just move forward
   }
 } 

А так можно поставить

List<Missile> missiles = new List<Missile> {
  new Missile(...),
  new TrackingMissile(...),
  new GuidedMissile(...)
};

// Whatever missiles launched, update their locations
foreach (var missile in missiles)   
  missile.Update(target);
0 голосов
/ 21 октября 2019

Если вы используете c # 7.0 или выше, вы можете использовать сопоставление с шаблоном .

List<Missile> missiles = new List<Missile> {
    new Missile(...),
    new TrackingMissile(...)
};

foreach (var missile in missiles) {
  if (missile is TrackingMissile tm) {
    tm.Update(target);
  } else { 
    missile.Update();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...