【问题标题】:Is this bad practice? Overloading methods for generic interface and returning different types这是不好的做法吗?重载泛型接口的方法并返回不同的类型
【发布时间】:2011-05-10 17:44:50
【问题描述】:

作为这个问题的后续:
Is a bad practice to Return different types when overloading a method?

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

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 的概念并不真正适用于我的通用映射器。这只是一个双向映射。 因此,为了补充链接的问题:
这种通用地图是不好的做法吗?

我应该如何命名方法以避免返回不同的类型而不影响接口的“通用性”?

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

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

【问题讨论】:

    标签: c# generics interface mapper


    【解决方案1】:

    这很难,因为您无法将 T 和 U 限制为不同类型,因此您总是冒着让它们相同的风险。我想说你只需要找到两个你可以忍受的名字,比如:

    • 地图优先
    • MapSecond

    或者:

    • 地图
    • 反向映射

    或者:

    • 转发
    • 反向

    【讨论】:

    • 当我实现接口时,如果 U 和 T 是相同类型,我将无法编译,因为两个方法将具有相同的签名。
    • 但是 U 和 T 可以是由您传递给参数的同一个类实现的接口。我同意詹姆斯的说法,让它有两个功能。我通常对重载非常小心。
    【解决方案2】:

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

    我会创建这样的界面:

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

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

    【讨论】:

    • 这并没有解决问题。我仍然得到了两个方法,同名,返回不同的类型。
    • 另外,我也使用字典来映射它们,它只是不是我界面的一部分,因为界面不关心如何我跟踪对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多