Roy*_*mir 4 .net c# clr .net-4.0
(再次烦人的问题......)
之前问过这个 - (这部分与我的问题有关) - 我得到了一个答案:
参见C#4规范的§7.6.5.1:
候选方法集合被简化为仅包含来自大多数派生类型的方法:对于集合中的每个方法CF,其中C是声明方法F的类型,所有在基本类型C中声明的方法都从集合.
好.
我有这个代码://.Dump() is like a WriteLine command...
public class Base
{
public void Foo(string strings) { "1".Dump();}
public virtual void Foo(object strings) { "2".Dump();}
}
public class Child : Base
{
public override void Foo(object strings) { "4".Dump();}
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码:
Child c = new Child();
c.Foo("d");
Run Code Online (Sandbox Code Playgroud)
发出: "1"
可是等等 ...
我们不这么说is reduced to contain only methods from the most derived types:吗?
Child的父亲有一个函数public void Foo(string strings)和一个NEARER覆盖函数.
那他为什么选择它的基地功能呢?继承的函数是否比覆盖更复杂?
是否与覆盖在运行时有关?
请帮忙.
这种情况怎么样?
public class Base
{
public virtual void Foo(int x) { "1".Dump();}
}
public class Child : Base
{
public override void Foo(int x) { "2".Dump();}
public void Foo(object x) { "3".Dump();}
}
void Main()
{
Child c = new Child();
c.Foo(6); //emits "3"
}
Run Code Online (Sandbox Code Playgroud)
那是因为你的孩子拿走了一个物体.
public class Child : Base
{
public override void Foo(object strings) { "4".Dump();}
}
Run Code Online (Sandbox Code Playgroud)
使它成为字符串,然后将调用其中一个.
public class Child : Base
{
public override void Foo(string strings) { "4".Dump();}
}
Run Code Online (Sandbox Code Playgroud)
为什么这个?
因为编译器看到子进程有参数,object所以必须转换为string基类时它可以作为字符串使用.
所以它称之为基础.
虽然重写功能在子类中更接近.但是这里的规则在孩子和基础上是不同的.孩子有对象,基础有字符串.这是公平的,如果有两个object或两个有string.
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |