1

私は現在、機能するいくつかのコードを扱っています。本当にこれらすべてを「ブラインド」にするべきかどうかに要約されます。キャスト。

私はクラスを持っています:

public abstract class Trigger
{
  // no logic, just three automatic properties
}

これは次の人に継承されます:

// there are several classes like this that store different things like strings,
// int,floats, enums, etc,etc.
public class ActivateOnTimeDelay : Trigger
{
   // More automatic properties and possibly fields.
}

次に、これらのクラスをList<Trigger>

別のクラスでは、逆forループでリストを反復処理します

if (currentMission.ActiveTriggers.Count > 0)
{
  for (int i = currentMission.ActiveTriggers.Count - 1; i >= 0; i--)
  {
   ActivateOnDeathDelay activateOnDeathD = currentMission.ActiveTriggers[i] as    ActivateOnDeathDelay;
   ActivateOnDeathImmediate activateOnDeathI = currentMission.ActiveTriggers[i] as ActivateOnDeathImmediate;
   ActivateOnFinishDelay activateOnFinishD = currentMission.ActiveTriggers[i] as ActivateOnFinishDelay;
   ActivateOnFinishImmediate activateOnFinishI = currentMission.ActiveTriggers[i] as ActivateOnFinishImmediate;
   ActivateOnFinishMass activateOnFinishM = currentMission.ActiveTriggers[i] as ActivateOnFinishMass;
   ActivateOnTimeDelay activateOnTimeD = currentMission.ActiveTriggers[i] as ActivateOnTimeDelay;
   ActivateOnTimeImmediate activateOnTimeI = currentMission.ActiveTriggers[i] as ActivateOnTimeImmediate;

   DisplayDialog displayDialog = currentMission.ActiveTriggers[i] as DisplayDialog;
   SpawnEnemy spawnEnemy = currentMission.ActiveTriggers[i] as SpawnEnemy;

   if (activateOnDeathD != null)
   {
     // do logic
   }

   // more null checks for each possible item that may be created this loop pass.

トリガーが使用されると、リストから削除され、そのIDがHashSet<string>UsedTriggersに配置され、一部のトリガーが監視します。

4

1 に答える 1

3

一般に、ここで発生する必要があるのは、各具体的なタイプのトリガーが適切に実装する抽象的なメソッドを公開することですTrigger(またはおそらくITriggerインターフェース)。このようにキャストする必要はありません、あなたはただのようなことをします

for (int i = currentMission.ActiveTriggers.Count - 1; i >= 0; i--)
{
    // Run() is an abstract method on Trigger
    currentMission.ActiveTriggers[i].Run();
}

または、おそらくLINQ(読みやすさの向上)でさらに良くなります:

foreach (var trigger in currentMission.ActiveTriggers.Reverse())
{
    trigger.Run();
}
于 2013-02-24T16:41:32.360 に答える