修改实现泛型接口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,并修改值。有什么想法吗?
您正试图将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
,依此类推
通过为算术运算创建一个具有抽象方法的抽象基类,可以稍微减少重复代码的数量,每个派生类都需要重写该抽象基类。