gpt4 book ai didi

C# 泛型约束 : Interface

转载 作者:太空宇宙 更新时间:2023-11-03 21:30:33 25 4
gpt4 key购买 nike

我有一些代码问题:

interface IDistance<T> 
{
double distance();
double distance(T obj);
}

class Point<T> where T : IDistance<T> //why do i need this?
{
T obj;
public double dist(T val) { return obj.distance(val);
public Point(T obj) { this.obj = obj; }
}

class P2D : IDistance<P2D>
{
public double[] x = new double[2];

public P2D(double x, double y)
{
this.x[0] = x; this.x[1] = y;
}

public double distance()
{
double d = 0.0;
for (int i = 0; i < 2; i++) d = d + x[i] * x[i];
return Math.Sqrt(d);
}

public double distance(P2D val)
{
double d = 0.0;
for (int i = 0; i < 2; i++) d = d + Math.Pow(x[i]-val.x[i],2);
return Math.Sqrt(d);
}
}

class Tester
{
static void Main(string[] args)
{
P2D P1 = new P2D(3.0, 4.0);
Point<P2D> C1 = new Point<P2D>(P1);
Console.WriteLine(C1.dist());
}
}

详细的代码并不重要。

为什么我需要约束 where T : IDistance<T>在通用类中 Point<T>

当我只指定已经实现接口(interface)的类时 IDistance<T>喜欢P2D 类,不应该是已经在类中隐式实现的接口(interface) Point

我知道它可能会导致问题,当类类型为 <T> 时在类里面Point被定义为尚未实现该接口(interface)。但是在这种情况下,为什么不可以呢?

最佳答案

查看 Point<T> 中的这段代码:

T obj;
public double dist(T val) { return obj.distance(val);

当编译器试图理解这个表达式的含义时:

obj.distance(val)

它必须解决 distance成员。如果T不受约束,它不能那样做。当T被限制实现IDistance<T> ,它可以 - 它将它解析为接口(interface)的成员。

特别是,在没有约束的情况下,我可以以非常奇怪的方式使用该类型:

Point<string> weird = new Point<string>("foo");
double result = weird.dist("bar");

你希望它做什么?

(作为旁注,遵循正常的 .NET 命名约定是值得的,即使是示例。方法应该是 PascalCased,我永远不会调用类 P2D ...)

关于C# 泛型约束 : Interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24529775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com