Soy nuevo en C# y tengo un proyecto en el que tengo una Task de clase principal con clases derivadas FixedTask y RelativeTask .
FixedTask y RelativeTask tienen propiedades diferentes, con nombres diferentes. Y necesito realizar algunos cálculos con cada Task para calcular alguna carga de trabajo.
Un Project contiene diferentes Tasks que pueden ser de varios tipos, por ejemplo FixedTask y RelativeTask . Estaba planeando hacer algo como esto:
foreach (Task Task in this.Tasks) { switch (Task) { case FixedTask: switch (Task.Frequency) { case "Daily": // do some calculations // other frequency cases } // other Task cases } Pero recibo un error de que Task no tiene un parámetro en particular porque está implementado en FixedTask pero no en RelativeTask .
Hubiera pensado que el patrón de switch le permitió a C # entender qué tipo debe considerar, pero aparentemente no.
¿Cuál es la forma correcta de lograr lo que quiero?
Coincidencia de patrones: case FixedTask f .
Pero no deberías. Su clase base no debe saber ni preocuparse por cómo se implementan las clases derivadas.
El propósito de OO y la herencia es que las clases derivadas contengan su propia lógica. Entonces, si su ejecutor de tareas quiere ejecutar una tarea, hágalo:
foreach (Task task in this.Tasks) { task.Execute(); } Y luego, cada clase derivada de tareas tiene la lógica en su método Execute() anulado.
La coincidencia de patrones ayuda a:
foreach (Task Task in this.Tasks) { switch (Task) { case FixedTask ft: switch (ft.Frequency) { case "Daily": ... } case RelativeTask rt: switch (rt.OtherProperty) { case ...: }Como una enmienda rápida (pero no la mejor), sugiero la coincidencia de patrones , es decir
foreach (Task task in Tasks) { if (task is FixedTask fixedTask) { // From now on you work with fixedTask switch (fixedTask.Frequency) { ... } } else if (task is RelativeTask relativeTask) { // From now on you work with relativeTask } }