这是不好的做法吗?泛型接口的重载方法并返回不同的类型

本文关键字:方法 重载 泛型接口 类型 返回 | 更新日期: 2023-09-27 17:55:46

作为这个问题的后续:
重载方法时返回不同类型的做法是不好的吗?

正在考虑我正在使用的一个非常简单的映射器界面:

public interface IMap<T,U>
{
    U MapFrom(T obj);
    T MapFrom(U obj);
}

这也许是上述问题讨论的一个更有针对性的例子。实现此接口的实例只是在类型之间映射。
我可以这样做:

public interface IMap<T,U>
{
    U MapRight(T obj);
    T MapLeft(U obj);
}

但这似乎很愚蠢,因为从概念上讲,tofrom的概念并不真正适用于我的通用映射器。这只是一张双向地图。因此,为了补充链接的问题:
这是通用地图的不良做法吗?

我应该如何命名方法以避免返回不同的类型,而不会影响接口的"泛型"?

编辑:另外,作为对答案的回应,这是针对映射器的(并不是说它真的很相关)。我只是没有在界面中包含映射方法。

EDIT2:我想如果我有一个单向映射器(或适配器),那么同样的问题也会适用,然后我为两个方向实现了两次......相同的方法名称,不同的返回类型。

这是不好的做法吗?泛型接口的重载方法并返回不同的类型

这很难,因为你没有办法限制T和你不是同一个类型,所以你总是冒着让它们相同的风险。 我想说你需要找到两个你可以接受的名字,比如:

  • 地图优先
  • 地图第二

或:

  • 地图
  • 反向映射

或:

  • 向前
  • 反向

首先,你不是在映射,而是在转换。 这是有区别的。 映射是字典的作用。 转换是当您输入一种类型并取出另一种类型时发生的情况。

我会像这样创建界面:

interface IConvertible<TSource, TResult>
{
    TResult Convert(TSource source);
}

您想要双向转换吗? 伟大。 同时实现 IConvertible 和 IConvertible。 想要将其封装到单个接口中吗? 太好了,创建ITwoWayConvertible并实现两者。