【问题标题】:C# - Method inside generic class with additional constraints to TC# - 泛型类中的方法,对 T 有附加约束
【发布时间】:2018-10-27 20:20:10
【问题描述】:

我有一个通用类Foo<T> where T: SomeBaseType

TSpecificDerivedType 的特定情况下,我希望我的班级有一个额外的方法。

类似:

class Foo<T> where T: SomeBaseType
{
    //.... lots of regular methods taking T, outputting T, etc.

    //in pseudo code
    void SpecialMethod() visible if T: SpecificDerivedType
    {
        //...code...
    }
}

我怎样才能做到这一点?

【问题讨论】:

  • 我不认为这是可能的,但在这里评论看看会发生什么
  • 您可以将SpecialMethod 设为Foo&lt;SpecificDerivedType&gt; 的扩展方法。

标签: c# oop generics


【解决方案1】:

Foo&lt;T&gt;创建一个extension method

public static void SpecialMethod<T>(this Foo<T> foo)
    where T : SpecificDerivedType
{
}

【讨论】:

    【解决方案2】:

    我怎样才能做到这一点?

    你不能。创建一个专门的Foo

    class SpecialFoo<T> : Foo<T> where T: SpecificDerivedType
    {
        void SpecialMethod()
        {
            //...code...
        }
    }
    

    其他人建议extension method,显然和你问的不一样。不过,这可能是一种解决方法。

    【讨论】:

    • 扩展方法是一个选项,但这个答案更好,因为它允许在其他方法中更多地控制可访问性级别。
    【解决方案3】:

    没有什么完全一样的,但是您可以Foo&lt;T&gt; 上添加一个extension method,其约束比T 通常具有的更具体。这是一个完整的例子:

    using System;
    
    class SomeBaseType {}
    class SomeDerivedType : SomeBaseType {}
    
    static class FooExtensions
    {
        public static void Extra<T>(this Foo<T> foo)
            where T : SomeDerivedType
        {
            Console.WriteLine("You have extra functionality!");
        }
    }
    
    class Foo<T> where T : SomeBaseType
    {
    }
    
    class Program
    {
        static void Main(string[] args)        
        {
            Foo<SomeBaseType> foo1 = new Foo<SomeBaseType>();
            Foo<SomeDerivedType> foo2 = new Foo<SomeDerivedType>();
    
            // Doesn't compile: the constraint isn't met
            // foo1.Extra();
    
            // Does compile
            foo2.Extra();
        }
    }
    

    这允许您在现有实例上调用该方法,而不必创建更专业的实例。另一方面,它依赖于扩展方法,它有足够的访问权限来执行Foo&lt;T&gt; 中所需的任何操作。您可能需要在 Foo&lt;T&gt; 中有一个不受约束的 internal 方法,以便 FooExtensions.Extra 调用。

    【讨论】:

      【解决方案4】:

      您可以创建一个如下所示的extension method

      public static void SpecificMethod<T>(this Generic<T> instance) 
          where T : SpecificDerivedType
      

      【讨论】:

      • 将方法应用于SpecificDerivedType,而不是Foo&lt;SpecificDerivedType&gt;Foo&lt;SomeTypeDerivedFromSpecificDerivedType&gt;
      • 哦,确实需要更正。既然你已经发布了正确的答案,我就不打扰了。
      • @Vladislav 上面的答案完全相同,因此复制没有意义。
      • @SerejaBogolubov 已经删除了我的评论,因为您添加了描述。发布正确和描述性的答案或什么都不发布是有意义的。稍后阅读本文的人(如果有的话)可能会感到困惑,你不觉得吗?
      • @Vladislav,通常同意,但在这种特殊情况下并非如此。其实不是我编的。油炸鬼就在附近:)
      猜你喜欢
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多