Ich versuche, ein Strategiemuster zu implementieren, um mir zu ermöglichen, einen "Nutzen" auf ein "Konto" anzuwenden. Im folgenden Code kann ich meine Implementierung einer Schnittstelle nicht in ein Wörterbuch einfügen, das die Schnittstelle erwartet. Ich denke, es ist eine Art von Kontravarianz Problem, aber es fühlt sich wie ich sollte in der Lage sein, dies zu tun:
EDITAR:
Da die Antwort zu sein scheint, dass es einfach nicht möglich ist, irgendwelche Vorschläge, wie man zu erreichen, was ich hier anstrebe?
void Main()
{
var provider = new BenefitStrategyProvider();
var freeBenefit = new FreeBenefit();
var strategy = provider.GetStrategy(freeBenefit);
strategy.ApplyBenefit(freeBenefit, new Account());
}
public class BenefitStrategyProvider
{
private Dictionary<Type, IBenefitStrategy<BenefitBase>> _strategies = new Dictionary<Type, IBenefitStrategy<BenefitBase>>();
public BenefitStrategyProvider()
{
/* Why can't I add this? */
_strategies.Add(typeof(FreeBenefit), new FreeBenefitStrategy());
}
public IBenefitStrategy<BenefitBase> GetStrategy(BenefitBase benefit)
{
return _strategies[benefit.GetType()];
}
}
public class Account {}
public abstract class BenefitBase
{
public string BenefitName {get;set;}
}
public class FreeBenefit : BenefitBase {}
public interface IBenefitStrategy<T> where T: BenefitBase
{
void ApplyBenefit(T benefit, Account account);
}
public class FreeBenefitStrategy : IBenefitStrategy<FreeBenefit>
{
public void ApplyBenefit(FreeBenefit benefit, Account account)
{
Console.WriteLine("Free Benefit applied");
}
}