Soy un novato e intento comprender los conceptos de herencia y patrones de diseño.Pasando Clase derivada como parámetro de un método cuando el tipo de parámetro es clase base
Me encontré con este patrón http://en.wikipedia.org/wiki/Strategy_pattern cuando estaba revisando algún blog.
Me pareció interesante y quería aprender más. Entonces desarrollé el siguiente programa.
static void Main(string[] args)
{
Context context;
// Three contexts following different strategies
context = new Context(new ConcreteStrategyAdd());
int resultA = context.executeStrategy(3, 4);
context = new Context(new ConcreteStrategySubtract());
int resultB = context.executeStrategy(3, 4);
context = new Context(new ConcreteStrategyMultiply());
int resultC = context.executeStrategy(3, 4);
Console.Read();
}
abstract class Strategy
{
public abstract int execute(int a, int b);
public void Test()
{
Console.Write("tttt");
}
}
class ConcreteStrategyAdd : Strategy
{
public override int execute(int a, int b)
{
Console.WriteLine("Called ConcreteStrategyAdd's execute()");
return a + b; // Do an addition with a and b
}
}
class ConcreteStrategySubtract : Strategy
{
public override int execute(int a, int b)
{
Console.WriteLine("Called ConcreteStrategySubtract's execute()");
return a - b; // Do a subtraction with a and b
}
}
class ConcreteStrategyMultiply : Strategy
{
public override int execute(int a, int b)
{
Console.WriteLine("Called ConcreteStrategyMultiply's execute()");
return a * b; // Do a multiplication with a and b
}
}
class Context
{
private Strategy strategy;
// Constructor
public Context(Strategy strategy)
{
this.strategy = strategy;
}
public int executeStrategy(int a, int b)
{
return strategy.execute(a, b);
}
}
El programa compila bien y está funcionando. Pero mi pregunta es ¿cómo es posible pasar la clase derivada como parámetro cuando el constructor Context
espera una clase base como parámetro? ¿El casting está sucediendo implícitamente? ¿Por qué el compilador no tiene errores?
context = new Context(new ConcreteStrategyAdd());
public Context(Strategy strategy)
{
this.strategy = strategy;
}
+1 para una buena pregunta principiante! –
Para un novato, usted está haciendo todas las preguntas correctas :) +1 – MattDavey