泛型中的接口约束



比方说,我有一个策略的列表,这些策略被表示为接口,还有一个类(容器(,它显式地实现了这些策略。现在,我想要一个方法来执行其中一个策略,因为它在泛型类型参数中指定。问题在代码中。

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);
}
}

您可以让它在runtume上决定由以下代码运行哪种策略。

class Container<T> Where T : IStrategy
{
public void ActionFactory()
{
T.PerformAction();
}
.
.
.
}

在程序类中:

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());

最新更新