修改实现泛型接口C#的泛型类中的值类型

本文关键字:类型 泛型类 修改 泛型接口 实现 | 更新日期: 2023-09-27 18:30:04

Hei,

我一直在找,但找不到合适的答案。。。也许给我指一下。

所以我有一个接口和一个Point类:

interface IDoable<T>{
    void DoSomething<T>(T ) ;
}
class Point<T>:IDoable <T>{ 
    public T x;
    public T y;
    public Point(T x, T y){
        this.x = x;
        this.y = y;
    }
    public void DoSomething<T>(Point<T> p){
        p.x += 10;
        p.y += 10;
    }
}

但它告诉我不能这么做,因为int不能转换成T

我需要接口能够接受任何类型的Point,无论是int、float、double还是else,并修改值。有什么想法吗?

修改实现泛型接口C#的泛型类中的值类型

您正试图将10(整数)添加到T类型的值中。T可以是整数、DateTime、List或其他自定义类。这意味着绝对不能保证您的T能够将自己添加到整数中。

不幸的是,C#中没有办法添加一个泛型类型约束,将参数限制为支持特定操作的类型。

有变通办法,但很难看。即,您可以拥有:

class Point<T>{ ... }

然后进行

class IntPoint : Point<int>, IDoable<int> { ... }
class DoublePoint : Point<double>, IDoable<Double> { ... }

第一个:
接口的定义不正确。DoSomething不应该有自己的泛型参数
它应该是这样的:

interface IDoable<T>
{
    void DoSomething(T p) ;
}

第二:
在.NET中,没有任何接口、公共基类或其他可能允许泛型类使用某个运算符
换句话说:您必须为要使用的每个数字类型创建一个类
如果这个实现的DoSomething方法应该将*Point作为参数(根据您的问题),那么int的实现将如下所示:

class IntPoint : IDoable<IntPoint>
{ 
    public int x;
    public int y;
    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
    public void DoSomething(IntPoint p)
    {
        p.x += 10;
        p.y += 10;
    }
}

您需要为doubles创建一个类DoublePoint,依此类推

通过为算术运算创建一个具有抽象方法的抽象基类,可以稍微减少重复代码的数量,每个派生类都需要重写该抽象基类。