2013-02-24 96 views
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>

,並在另一個類疊代的名單反向循環

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>用於觸發器的某些觸發器。

回答

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(); 
}