能解释下为什么吗?

wplpss 2011-03-10 11:03:25

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{

class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
}

class B : A
{
public override void F()
{
Console.WriteLine("B.F");
}
}

class C : B
{
new public virtual void F()
{
Console.WriteLine("C.F");
}
}

class D : C
{
public override void F()
{
Console.WriteLine("D.F");
}
}

public class Test
{
static void Main()
{

D d = new D();
A a = d;
B b = d;
C c = d;
a.F();
b.F();
c.F();
d.F();

Console.ReadKey();

}
}
}

运行结果为:
B.F
B.F
D.F
D.F

问题:
a.F(),b.F(),c.F()的结果,能解释一下为什么吗?

谢谢!
...全文
87 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
testtestett 2011-03-10
  • 打赏
  • 举报
回复
new public virtual void F()
注意这里的new,这个关键字让这个函数跟之前的函数区分,为不同的函数,所以不是继承中的覆盖。
  • 打赏
  • 举报
回复
关键再于你new了一下 又创建了另一个示例 虽然方法名是一样的 本质上和换成其他的名字没什么区别
IM8888 2011-03-10
  • 打赏
  • 举报
回复
其实也就是继承。 D继承C C继承B B继承A 然后向下转型
lovelan1748 2011-03-10
  • 打赏
  • 举报
回复
大体如此,要想得到更理论更学术性的解答,得等sp1234这类人物了
lovelan1748 2011-03-10
  • 打赏
  • 举报
回复
实际上abcd都指向实例D,如果没有new,都将输出实例D的F方法,也就是D.F。
但是使用new会用同样的名称创建一个新成员并使原始成员变为隐藏的。也就是说对于AB和CD,这两组中的F方法完全不同,可以将new后的方法看做一个新的方法G
也就是
a.F();
b.F();
c.G();
d.G();
wplpss 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 loveyan52152112 的回复:]
看着个题想起我刚刚学C#时!!

virtual 被继承override儿子覆盖老子
[/Quote]
这谁都知道,别泛泛的讲,具体每一个,为什么?
白鸽 2011-03-10
  • 打赏
  • 举报
回复
看着个题想起我刚刚学C#时!!

virtual 被继承override儿子覆盖老子

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧