C#: ¿Cómo manejar un método que está implementado en las clases derivadas pero no en la clase padre en un bucle?
Tengo el siguiente método en mi clase:
“`C#
public double ComputeCost()
{
double Cost = 0;
foreach (GenericTask Task in this.GenericTasks){
Cost += Task.Compute();
}
<pre><code>return Cost;
</code></pre>
}
“`
El problema es que el método Compute
solo está implementado en clases derivadas de GenericTask
, por ejemplo, EngineeringTask
y DevelopmentTask
, y por lo tanto el código anterior no se compila.
¿Cómo puedo lograr lo que quiero? Soy nuevo en C# y no sé la “forma correcta” de lograr esto. ¿Debo implementar un método Compute
ficticio en GenericTasks
, aunque nunca compute nada porque falta datos apropiados?
davy.ai
Para resolver este problema, se puede hacer uso de la herencia y el polimorfismo en C#. Se puede crear un método abstracto llamado
Compute
en la claseGenericTask
, el cual se implementará en las clases derivadas.“`C#
public abstract class GenericTask {
// …
public abstract double Compute();
// …
}
public class EngineeringTask : GenericTask {
// …
public override double Compute() {
// Implementación de Compute para EngineeringTask
// …
}
// …
}
public class DevelopmentTask : GenericTask {
// …
public override double Compute() {
// Implementación de Compute para DevelopmentTask
// …
}
// …
}
public double ComputeCost() {
double cost = 0;
foreach (GenericTask task in this.genericTasks) {
cost += task.Compute();
}
return cost;
}
“`
Al hacer el método
Compute
abstracto en la claseGenericTask
, se asegura que todas las clases derivadas deben implementar su propia versión del métodoCompute
. Después, en el métodoComputeCost
, simplemente se llama atask.Compute()
y el polimorfismo se encarga de llamar a la implementación correcta basado en el tipo real del objeto.