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

时间:2013-09-04 09:33:21

标签: c# generics interface

平,

我一直在寻找但找不到合适的答案......也许指出了我。

所以我有一个接口和一个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,或者修改该值。 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

不幸的是,C#中没有办法添加generic type constraint,这会将参数限制为支持某种操作的类型。

有解决方法,但它们很难看。即你可以:

class Point<T>{ ... }

然后有

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

答案 1 :(得分:1)

第一:
您的界面定义不正确。 DoSomething不应该有自己的通用参数 它应该是这样的:

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

第二:
.NET中没有接口,公共基类或其他可能允许泛型类使用某个运算符的可能性 换句话说:您必须为每个要使用的数字类型创建一个类 如果此实现的DoSomething方法应该以{{1​​}}作为参数 - 根据您的问题 - *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; } } 创建一个类DoublePoint,依此类推。

您可以通过使用抽象方法创建抽象基类来减少重复代码的数量,该算法操作需要被每个派生类覆盖。