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

发布于 2024-11-06 19:38:51 字数 892 浏览 1 评论 0原文

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

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

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

我应该如何命名方法以避免返回不同类型而不损害界面的“通用性”?

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

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

As a follow-up to this question:
Is a bad practice to Return different types when overloading a method?

I am thinking about a very simple mapper interface I'm using:

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

This is perhaps a more targeted example of the noted question's discussion. An instance implementing this interface just maps between types.
I could do it this way:

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

but that seems silly because, conceptually, the notion of to and from don't really apply to my generic mapper here. It's just a bidirectional map.
So, to compliment the linked question:
Is this generic map bad practice?

How should I name methods to avoid returning different types without compromising the "genericness" of the interface?

EDIT: Also, in response to an answer, this is for mapper (not that it's really relevant). I just don't include the mapping method in the interface.

EDIT2: I suppose the same question would apply if I had a single-direction mapper (or adapter) then I implemented it twice for the two directions... same method name, different return type.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

撩发小公举 2024-11-13 19:38:51

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

  • MapFirst
  • MapSecond

或:

  • Map
  • ReverseMap

或:

  • Forward
  • Reverse

That's tough because you have no way of restricting T and U to not be the same type, so you always run the risk of having them be the same. I'd say you need to just find two names you can live with, like:

  • MapFirst
  • MapSecond

Or:

  • Map
  • ReverseMap

Or:

  • Forward
  • Reverse
ら栖息 2024-11-13 19:38:51

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

我会创建这样的界面:

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

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

First, you're not mapping, you're converting. There's a difference. Mapping is what a dictionary does. Converting is what happens when you put in one type and get a different one out.

I would create the interface like this:

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

You want two way conversion? Great. Implement both IConvertible and IConvertible. Want to encapsulate that into a single interface? Great, create ITwoWayConvertible and implement both.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文