MSDN Signatures and overloading包含以下方法签名定义:
方法的签名包括方法的名称和 每种形式的类型和种类(价值,参考或输出) 参数,按从左到右的顺序考虑。 a的签名 方法具体不包括返回类型 ,也不包括 包括可以为最右边指定的params修饰符 参数。
我期望看到的是方法签名应该包含返回类型,但它不包含。
忽略(不包括)返回类型到方法签名定义的利润是多少?你能举个例子吗?
答案 0 :(得分:1)
这可能部分不正确,我确信这仅仅是完整答案的一部分,但让我们看看我是否能够澄清其中的至少一部分。既然你问过很多问题,我会尽量回答。
void
,string
,int
或其他方式开始您的方法定义。 覆盖不等于过载 - 重载方法意味着您可以使用不同的版本指定相同的方法。假设您有一个返回两个整数之和的方法。您可以定义以下方法:
public int Sum()
{
return 1 + 1;
}
您可以通过声明另一个方法签名来重载此方法,该方法接受参数以使方法以稍微不同的方式工作,例如:
public int Sum(int a)
{
return 1 + a;
}
在这里,您将有一个方法的两个不同的签名,您可以以不同的方式调用。 覆盖方法意味着您将方法的行为更改为全新方法。假设我的基类具有可覆盖的方法:
public int Sum()
{
return 1 + 1;
}
覆盖这意味着:
public override int Sum()
{
return 1 - 1;
}
覆盖意味着您取代原始方法并使用相同的签名。
是的,就是这样。因为您只能定义一个具有相同签名的方法。 关于方法签名和返回类型,您必须了解的是它们不相关。请考虑以下方法:
public int Sum(int a)
{
return 1 + a;
}
public int Sum(string a)
{
int b = int.Parse(a);
return 1 + b;
}
这些方法具有相同的返回类型,但具有不同的签名,因为它们接受不同的参数。第一个采用整数,第二个采用字符串值。然而,它们产生相同的输出。
答案 1 :(得分:0)
是的,它没有。方法签名仅涉及方法名称,参数,是否ref
/ out
并且它不包含返回类型。
重载,解决方案基于方法签名发生,因此有两个方法如下所示根本不会重载,因为它们只是因返回类型而不同。
public void foo(int data) {};
public int foo(int data) {};
答案 2 :(得分:0)
忽略退货类型有什么好处?你能举个例子吗?
我不确定这不是基于意见的,但最后提供方法重载应该是完成“同样的事情”,只是使用不同的输入。方法的返回类型不应该改变,否则它们可能不应该具有相同的名称,对吧?
术语“重载”和“覆盖”是否相关?
overloading
正在提供新的方法签名,以实现相同的目标。
重载示例:
public string AddTotesToInput(string input)
{
return string.format("totes {0}", input);
}
public string AddTotesToInput(int input)
{
return string.format("totes {0}", input.ToString());
}
请注意上面的内容,他们使用不同的方法签名做同样的事情。
overriding
为现有方法签名提供了新的实现。
示例:
public class Foo
{
public virtual string AddTotesToInput(string input)
{
return string.format("totes {0}", input);
}
}
public class NewFoo : Foo
{
// requirements changed, and now we need "totes mcgotes" on new implementations of the Foo class
public override string AddTotesToInput(string input)
{
return string.format("totes mcgotes {0}", input);
}
}
我猜?您是否覆盖了特定的方法签名,因此它们必须是正确的?术语“方法签名”是否与“覆盖”相关?
“方法签名”的定义是否应包含退货类型?
不,但是,再次,似乎是一个意见问题。
从@ Rahul的回答中稍微考虑一下你是否有类似的课程
// Note that it's not possible for this to compile as they have the same name and method signature
public class Foo
{
public void foo(int data) {};
public int foo(int data) {};
}
作为这个类的消费者,我将如何指定被调用的内容?
示例:
public void DoStuff()
{
int testData = 5;
Foo f = new Foo();
f.foo(testData); // which one would get called?
}
有一个原因是它按原样编写:)