Si ayuda, la siguiente pregunta es en el contexto de un juego que estoy construyendo.¿Cuál es la forma correcta de reemplazar el bloque de interruptores y Enum en esta situación (C#)?
En algunos lugares diferentes tengo la siguiente situación. Existe una clase padre, para este ejemplo llamada Skill, y tengo una cantidad de subclases que implementan los métodos de la clase padre. También existe otra clase para padres a la que llamaremos Vocación. Las habilidades deben enumerarse en diferentes subclases de Vocación. Sin embargo, esas habilidades deben estar disponibles para cualquier cosa en el juego que use cualquier vocación dada.
Mi configuración actual es tener un Enum llamado Skill.Id, de modo que la Vocación contiene una colección de valores de ese Enum y cuando una entidad en el juego asume esa Vocación, la colección pasa a otra clase, llamada SkillFactory. Skill.Id necesita una nueva entrada cada vez que creo una nueva subclase Skill, así como un caso en el bloque switch para el constructor de las nuevas subclases.
es decir .:
//Skill.Id
Enum{FireSkill,WaterSkill,etc}
//SkillFactory
public static Skill Create(Skill.Id id)
{
switch(id)
{
case Skill.Id.FireSkill:
return new FireSkill();
//etc
}
}
Esto funciona perfectamente bien, pero utilizando la enumeración y el bloque de interruptores como un intermediario entre los siente como un mayor gasto de lo que necesito para resolver este problema. ¿Existe una forma más elegante de crear instancias de estas subclases de habilidades, pero aún permite que Vocation contenga una colección que identifique las habilidades que puede usar?
Editar: Estoy bien descartando el enum y el bloque de conmutadores asociado, siempre que Vocation pueda contener una colección que permita la creación de instancias arbitrarias de las subclases de Habilidad.
Switch y lógica si las declaraciones son extremadamente rápidos, además de casi todos implementación de fábrica (que he visto) hace lo mismo que el uso un interruptor. En mi humilde opinión, no lo cambiaría. –
Estoy de acuerdo con esto, siempre que no esté duplicando el cambio entre múltiples rutinas dentro del tipo. En ese punto, una búsqueda del diccionario es a menudo un mejor enfoque, como puede ponga el "interruptor" en una sola ubicación en el código. –
esta es la forma más rápida y legible, ¿por qué debería encontrar otra manera? – ktutnik