什么是设计此解决方案的更合适的方法?
问题描述:
我目前正在处理一些有效的代码。真的归结到我是否应该让所有这些?盲目?管型。什么是设计此解决方案的更合适的方法?
我有一个类:
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>
用于触发器的某些触发器。
答
总的来说,这里应该发生的是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();
}