泛型中的接口约束

时间:2020-07-16 21:57:41

标签: c# generics interface

比方说,我有一个作为界面呈现的策略列表和一个明确实现这些策略的类( 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);
      }
}

1 个答案:

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