由于返回类型不能用于消除歧义方法,当你想要改变的只是返回类型时,什么是最简洁/最好的方法来重载方法?下面是一些示例代码;
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)没有任何意义,它只是存在,所以编译器可以告诉两种方法之间的区别。有没有更好的方法来做到这一点,或者我只是添加无用的参数?
答案 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)
我看到三个选项。
object
并在您的通话方法中消除歧义。我会选择#3。让他们成为“GetOne”和“GetTuple”,你就会全力以赴。
答案 2 :(得分:0)
在我的拙见中,关注点分离,如果方法执行不同的功能,那么我们将两个方法分开(不同的方法名称)。
但我会使其中一个是反射循环的私有方法,第一个方法将返回泛型类型的T或只是T(我可能超出了重载的主题,我想说的是上面的例子是返回字符串,但是对于复杂的对象,可以通过很多重载方法返回不同的类型,为什么不只返回T,让调用者得到T的对象。
重载很好,取决于要求。