当您想要更改的所有内容都是返回类型时,重载方法的最佳方法

时间:2013-08-01 22:42:05

标签: c# .net overloading overload-resolution

由于返回类型不能用于消除歧义方法,当你想要改变的只是返回类型时,什么是最简洁/最好的方法来重载方法?下面是一些示例代码;

public static string Get(string url, Guid id, bool logResponse = true, bool baseKey = false)
{
     Tuple<string, int> response = Get(url, id, true, logResponse, baseKey);

     if (response.Item2 > 399)
        return null;
     return response.Item1;
}


public static Tuple<string, int> Get(string url, Guid id, bool returnStatus, bool logResponse = true, bool baseKey = false)
{
    // leaving out lots of code in this method, you should be able to get the point without it
    int http_status;  
    string response = CallApi(url, key, "GET", out http_status);

    return new Tuple<string, int>(response, http_status);
}

上面的代码可以工作但是我有一个额外的param(returnStatus)没有任何意义,它只是存在,所以编译器可以告诉两种方法之间的区别。有没有更好的方法来做到这一点,或者我只是添加无用的参数?

3 个答案:

答案 0 :(得分:10)

更改方法名称,例如

string Get(string url, Guid id, bool logResponse)
Tuple<string, int> GetWithStatus(string url, Guid id, bool logResponse)

编程的主要目标不是告诉编译器有什么不同,而是告诉开发人员将会读取你的代码。另一个选项是返回状态为out参数:

string Get(string url, Guid id, bool logResponse, out int status)

我不太喜欢out个参数,但我更喜欢元组 - 什么会告诉名字Item2给使用你的方法的开发人员?是状态,重试计数,还是响应长度?方法名称和返回类型都不能说它是什么。

因此,即使对于重命名方法的第一种情况,我也将返回类型更改为类似

public class ServerResponse
{
    public string Content { get; set; }
    public HttpStatusCode Status { get; set; } // enum

    // use this in first method to check if request succeed
    public bool IsError
    {
       get { return (int)Status > 399; }
    }
}

答案 1 :(得分:2)

我看到三个选项。

  1. 返回object并在您的通话方法中消除歧义。
  2. 使方法成为通用方法,然后使用反射检测所需类型。
  3. 重命名方法。
  4. 我会选择#3。让他们成为“GetOne”和“GetTuple”,你就会全力以赴。

答案 2 :(得分:0)

在我的拙见中,关注点分离,如果方法执行不同的功能,那么我们将两个方法分开(不同的方法名称)。

但我会使其中一个是反射循环的私有方法,第一个方法将返回泛型类型的T或只是T(我可能超出了重载的主题,我想说的是上面的例子是返回字符串,但是对于复杂的对象,可以通过很多重载方法返回不同的类型,为什么不只返回T,让调用者得到T的对象。

重载很好,取决于要求。