我在思考函数重载...
重载方法具有相同的名称但具有唯一的签名。参数数量、参数类型或两者都必须不同。一个函数无法仅基于不同的返回类型进行重载。
那么在下面的例子中,为什么要重载 setName
而不是使用中间和姓氏值的可选参数?
class funOverload
{
public string name;
//overloaded functions
public void setName(string last)
{
name = last;
}
public void setName(string first, string last)
{
name = first + "" + last;
}
public void setName(string first, string middle, string last)
{
name = first + "" + middle + "" + last;
}
//Entry point
static void Main(string[] args)
{
funOverload obj = new funOverload();
obj.setName("barack");
obj.setName("barack "," obama ");
obj.setName("barack ","hussian","obama");
}
}
至少,使用以下内容可以减少需要编写的代码量:
public void setName(string first, string middle = "", string last = "")
{
name = first + "" + middle + "" + last;
// name = "barack" + "" + "";
}
//Entry point
static void Main(string[] args)
{
funOverload obj = new funOverload();
// could optionally set middle and last name values here as well
obj.setName("barack");
}
我理解重载的概念,但我不明白为什么它会比使用可选参数更可取(或反之亦然)。
有人可以解释一下吗?
仅供参考,这是我曾经重载过的第一个函数:http://pastebin.com/ynCuaay1。此函数允许您调用带参数或不带参数的
MySqlContext.GetReader()
。我认为这使代码变得更整洁,而不必每次都调用GetReader(sql, args.ToArray())
。
string middle = ""
的 DLL 进行编译,然后将其替换为具有string middle = null
的更新版本,而不重新编译,则仍会输入空字符串。此外,在继承/接口方面,没有任何虚拟/签名的内容。如果声明了MyInterface.Foo(string x = null)
,则实现可以声明MyClass.Foo(string x = "default")
,调用者将根据对象的已知类型编译/传递一个值。 - Chris Sinclair