比方说,我有一个作为界面呈现的策略列表和一个明确实现这些策略的类( Container )。现在,我希望一种方法能够执行通用类型参数中指定的这些策略之一。问题在代码中。
interface IStrategy
{
void PerformAction();
}
interface IChasingStrategy : IStrategy
{
new void PerformAction();
}
interface ITestStrategy : IStrategy
{
new void PerformAction();
}
class Container : IChasingStrategy, ITestStrategy
{
void IChasingStrategy.PerformAction()
{
Console.WriteLine("ChasingStrategy");
}
void IStrategy.PerformAction()
{
Console.WriteLine("Strategy");
}
void ITestStrategy.PerformAction()
{
Console.WriteLine("TestStrategy");
}
}
class Program
{
static void PerformStrategy<TStrategy>(Container container) where TStrategy : IStrategy
{
TStrategy strategy = container; //why can't I use here implicit casting?
//However this is valid:
//IStrategy strat = container;
//IChasingStrategy ch_strat = container;
//ITestStrategy ts_strat = container;
strategy.PerformAction();
}
static void Main(string[] args)
{
var container = new Container();
PerformStrategy<IChasingStrategy>(container);
}
}
答案 0 :(得分:0)
您可以让它决定在runtume中执行以下代码来执行哪种策略。
class Container<T> Where T : IStrategy
{
public void ActionFactory()
{
T.PerformAction();
}
.
.
.
}
在Program类中:
static void PerformStrategy<TStrategy>(Container<TStrategy> container) where TStrategy : IStrategy
{
container.ActionFactory(); //to perform the desired action for your strategy
}
当调用PerformStrategy方法时,可以通过以下方法决定应该使用哪个容器:
PerformStrategy(new Container<IChasingStrategy>);
可以通过使ActionFactory方法通用来取消类绑定。
class Container
{
public void ActionFactory<T>() where T: IStrategy
{
T.PerformAction();
}
.
.
.
}
class Program
{
static void PerformStrategy<TStrategy>(Container container) where T: IStrategy
{
container.ActionFactory<TStrategy>(); //to perform the desired action for your strategy
}
}
PerformStrategy<IChasingStrategy>(new Container());