【问题标题】:How to write a generic method and its default equivalent in C#如何在 C# 中编写泛型方法及其默认等效方法
【发布时间】:2015-07-09 11:20:52
【问题描述】:

我认为这个例子非常简单,展示了我想要实现的目标:

public class A : A<object>
{
    // public static A GetInstance() => new A();
    // I can't do this, because cannot override static methods
}

public class A<T>
{
    public static A<T> GetInstance() => new A<T>();

    // public static A GetInstance() => new A();
    // can't do this, because it says that the method is already defined
}

我基本上希望能够以两种方式使用方法GetInstance

  • 指定类型TA&lt;T&gt;.GetInstance()A.GetInstance&lt;T&gt;()(哪个都无所谓) - 应该返回类型A&lt;T&gt;
  • 不指定此类型:A.GetInstance() - 应返回类型 A

我怎样才能做到这一点?

【问题讨论】:

  • 严格来说,这不是generic method,而是属于泛型类的非泛型方法。
  • 你在试用abstract factory pattern吗?
  • @YuvalItzchakov 嗯,不完全是。我正在为内部错误构建一个简单的系统(收集执行操作期间发生的数据)。因此,如果我只想知道操作是否成功或有任何错误,我会返回 Result.Failed(Error.Something);但如果我还希望能够返回一些特定的数据,我会做 Result.Success("hello");

标签: c# class inheritance


【解决方案1】:
using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(A.GetInstance());
        Console.WriteLine(A<int>.GetInstance());
        Console.WriteLine(A.GetInstance<bool>());
        /*
            output :
            Program+A
            Program+A`1[System.Int32]
            Program+A`1[System.Boolean]
        */
    }

// 类

    public class A : A<object>
    {
        // non-generic method in non-generic class
        public static A GetInstance() 
        {
            return new A();
        }

        // generic method
        public static A<T> GetInstance<T>() 
        {
            return new A<T>();
        }
    }

    public class A<T>
    {
        // non-generic method in generic class
        public static A<T> GetInstance() 
        {
            return new A<T>();
        }
    }
}

【讨论】:

    【解决方案2】:
    public class A<T>
    {
        public static A<T> GetInstance()
        {
            return new A<T>();
        }
    }
    
    public class A : A<object>
    {
        public static new A GetInstance()
        {
            return new A();
        }
    
        public static A<T> GetInstance<T>()
        {
            return new A<T>();
        }
    }
    

    注意 A GetInstance() 左侧的 new 关键字。

    【讨论】:

    • 嗯...为什么是这个关键字?
    • 它向编译器表明重写非虚拟 GetInstance() 方法(在基类和派生类中都存在)是有意的。基本上,它消除了 VS 中的“...隐藏继承的成员...”警告。
    【解决方案3】:

    看起来这就是你想要的:

       public class A : A<object>
       {
           public static A<T> GetInstance<T>() => new A<T>();
           public new static A GetInstance() => new A();
       }
    
       public class A<T>
       {
           public static A<T> GetInstance() => new A<T>();
       }
    

    然后像这样使用它:

       var a = A<int>.GetInstance();
       var b = A.GetInstance<int>();
       var c = A.GetInstance();
    

    但是,通常您希望看到泛型类型继承自它们的非泛型等价物,而不是相反(例如 IEnumerable : IEnumerable)

    【讨论】:

      【解决方案4】:

      不如做一个这样的工厂:

      public class Factory<T>
      {
          public static A<T> Instance { get {return new A<T>(); } }
      }
      

      【讨论】:

        【解决方案5】:
        void Main()
        {
            var a = A.GetInstance();
            var b = A<object>.GetInstance();
            Console.WriteLine(a);
            Console.WriteLine(b);
        }
        
        class A<T>
        {
            public static A<T> GetInstance()
            {
                return new A<T>();
            }
        }
        
        class A : A<object>
        {
        }
        

        【讨论】:

        • 谢谢,但我试图返回 A 类型的对象,而不仅仅是 T :) 在默认情况下 - 只有 A
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多