为什么这不足以实现接口?

时间:2015-11-10 21:40:08

标签: c# generics

我正在尝试实现一个“Dimension”单元,它是一个泛型类型,但可以与其他不同类型的Dimension一起存储在列表中。

我希望能够在一个列表中存储这些“维度”的列表(例如,将Dimension<int>Dimension<string>一起存储在同一列表中),以及我还希望能够比较相同类型的维度(例如,将Dimension<string>的实例与另一个Dimension<string>实例进行比较,但从不比较{{1}的实例使用Dimension<int>)的实例。

我读过(这里:C# - Multiple generic types in one list)在一个列表中存储不同泛型类型的(?)方法是使用抽象类或接口。这让我实现了将它们存储在一个列表中的第一个目标。但是,我想迭代列表并进行比较,最终计算两个不同列表之间的总距离(距离是基于每个类型定义的)。

我也可能会对这一点感到困惑,所以我拍摄了一个非常基本的结构和实现的截图,并显示了我收到的编译时错误。

http://i.imgur.com/OBQDVBj.png

您可以在底部的“实现”类的方法中看到我想要实现的内容 - 您还可以看到我在尝试实现界面时遇到的具体问题。

所以我想我的问题是:

如何解决我收到的错误,以便实现界面有效?为什么它需要接口作为参数而不是允许接口的实现?

我猜更普遍 - 有没有更好的方法来实现我想做的事情?我想做的事情是否可以实现/有意义吗?

2 个答案:

答案 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
}