您应该已经收到了来自编译器的警告。您的新Method()
方法隐式隐藏了基础(您可以使用new
关键字使其显式,这也会使编译器警告静音)。另请参阅http://msdn.microsoft.com/en-us/library/aa691135%28v=vs.71%29.aspx。
请注意,在 C# 中,不存在仅基于其输出类型重载方法这样的事情。仅仅因为您的新方法恰好返回 astring
并不会使其签名与基的签名有任何不同。
请注意以下关于隐藏危险的警告,这也可能有助于说明正在发生的事情:
static void Main(string[] args)
{
BaseClass obj = new BaseClass();
DerivedClass obj2 = new DerivedClass();
var x = obj.Method(2); //returns 2
var z = obj2.Method(1); //returns 2 (2*2)
var a = ((BaseClass)obj2).Method(1); //returns 1 (base's implementation!)
}
class BaseClass
{
public int Method(int i) { return i; }
}
class DerivedClass : BaseClass
{
public int Method(int i) { return i * 2; }
}
这与以下代码中的行为不同,后者添加了一个新的Method(string)
重载:
static void Main(string[] args)
{
BaseClass obj = new BaseClass();
DerivedClass obj2 = new DerivedClass();
var x = obj.Method(2); //returns 2
var z = obj2.Method("1"); //returns "1"
var a = ((BaseClass)obj2).Method("1"); //returns "1"
}
class BaseClass
{
public int Method(int i) { return i; }
}
class DerivedClass : BaseClass
{
public string Method(string s) { return s; }
}