【问题标题】:When using generics, how do I define a static instantiator of the generic type?使用泛型时,如何定义泛型类型的静态实例化器?
【发布时间】:2021-08-27 05:48:11
【问题描述】:

我的目标(这样我就不会遇到 x-y 问题):

我正在尝试创建一个与T 泛型类型一起使用的Filter 类。由于过滤器可以进行矢量操作,因此我想将对象转换为Vector<double>,进行过滤,然后在请求数据后将其转换回T

接口不能有静态方法

我制作了一个应该看起来像这样的界面。

public interface IFilterable {

    public Vector<double> ToVector();
   
    public static IFilterable FromVector(Vector<double> vec);
}

这样我就可以在Filter 中使用它:

public class Filter<T> where T: IFilterable {
    private Vector<double> _state;

    public T GetState() { 
        return T.FromVector(); 
    }

接口不能有静态方法,所以我正在寻找一种替代方法,它可以提供这种行为,它仍然允许我使用 T 作为泛型类型。

【问题讨论】:

  • 一个抽象类允许你定义静态方法而不需要实现
  • @404 好主意,但仅在可过滤导数尚未扩展其他类时才有效。
  • IDE 告诉我“非抽象和非外部方法必须声明一个主体”,所以我现在添加了一个throw new NotImplementedException()
  • @muszeo 我认为“IFilterable”的全部目的是让一个类型实现在过滤器中使用所需的功能。在您想要类型本身的过滤器之外。

标签: c# .net generics interface static


【解决方案1】:

感谢@Fildor 提供接口解决方案:

public interface IFilterable<out T> where T: new() {

    abstract Vector<double> ToVector();

    T FromVector(Vector<double> vec);
}

Filter 可以这样使用:

public class Filter<T> where T : IFilterable<T>, new() {
    
    private Vector<double> _state;
    
    public T GetState() {
        return new T().FromVector(_state);
    }
}

其他解决方案包括使用抽象类而不是接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 2011-04-02
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多