我正在尝试实现一个“Dimension”单元,它是一个泛型类型,但可以与其他不同类型的Dimension一起存储在列表中。
我希望能够在一个列表中存储这些“维度”的列表(例如,将Dimension<int>
与Dimension<string>
一起存储在同一列表中),以及我还希望能够比较相同类型的维度(例如,将Dimension<string>
的实例与另一个Dimension<string>
实例进行比较,但从不比较{{1}的实例使用Dimension<int>
)的实例。
我读过(这里:C# - Multiple generic types in one list)在一个列表中存储不同泛型类型的(?)方法是使用抽象类或接口。这让我实现了将它们存储在一个列表中的第一个目标。但是,我想迭代列表并进行比较,最终计算两个不同列表之间的总距离(距离是基于每个类型定义的)。
我也可能会对这一点感到困惑,所以我拍摄了一个非常基本的结构和实现的截图,并显示了我收到的编译时错误。
您可以在底部的“实现”类的方法中看到我想要实现的内容 - 您还可以看到我在尝试实现界面时遇到的具体问题。
所以我想我的问题是:
如何解决我收到的错误,以便实现界面有效?为什么它需要接口作为参数而不是允许接口的实现?
我猜更普遍 - 有没有更好的方法来实现我想做的事情?我想做的事情是否可以实现/有意义吗?
答案 0 :(得分:2)
实现签名必须与接口签名匹配。在这种情况下,这意味着函数DistanceBetween
必须接受任何IDimension
,而不仅仅是它的特定实现。
接口承诺DistanceBetween
将接受任何 IDimension
作为参数。 Dimension<T>
尝试失败只会接受IDimension
的一个特定实施。要正确实施,您必须将Dimension<T>
中的签名更改为public double DistanceBetween(IDimension anyVarName)
。
答案 1 :(得分:1)
这是您的界面和您尝试的实施:
interface IDimension
{
double DistanceBetween(IDimension d);
}
public class Dimension<T> : IDimension
{
public T Data { get; private set; }
public Dimension(T data)
{
Data = data;
}
public double DistanceBetween(Dimension<T> otherPoint)
{
return 0;
}
}
现在接口完全,它们准确显示了实现接口成员所需的内容和方式。在这种情况下,您绝对需要一种方法DistanceBetween
,它不仅可以使用Dimension<T>
个对象,还可以使用IDimension
个对象。
界面说您需要能够将任何 IDimension
对象传递给该方法,因此只需接受一个子类型Dimension<T>
即可还不够。
首先,您需要直接实现该方法。但可以包含一个适用于特定类型Dimension<T>
的重载,以便提供特殊行为。
public double DistanceBetween(IDimension otherPoint)
{
if (otherPoint is Dimension<T>)
return DistanceBetween((Dimension<T>)otherPoint);
// general implementation, only using what the interface provides
return 0;
}
public double DistanceBetween(Dimension<T> otherPoint)
{
return otherPoint.Data - Data; // or whatever
}