大家来看看这个微软的认证题目

一起学习前端吧 2008-08-04 11:32:19
一道微软的认证题目,大家看一下:
class Program
{
static void Main(string[] args)
{
II ii = new Ch();
ii.show();
}
}
interface II
{
void show();
}
class Pa:II
{
public void show()
{
Console.WriteLine("in Pa");
}
}
class Ch : Pa
{
public void show()
{
Console.WriteLine("in Ch");
}
}

程序运行的输出结果为:in Pa
那位高手能解释一下为什么?
...全文
173 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
gylc168 2008-08-05
  • 打赏
  • 举报
回复
这里面实现的接口继承与类继承不一样.
Ssmell 2008-08-05
  • 打赏
  • 举报
回复
不明白也.....
520yunyuna 2008-08-05
  • 打赏
  • 举报
回复
答案已在上面了
wackyboy 2008-08-05
  • 打赏
  • 举报
回复
hidden 了
new的Ch对象里有两个show方法,一个是他自己的即show Ch,另一个是他的父类的即show Pa,
当调用子类的show的时候只调用子类的,不会调用父类的,也就是说子类将父类的方法隐藏了。
当子类的对象赋给父类的变量的时候,因为父类的变量只认识他自己的方法,所以就调用父类的show,结果是show Pa
lululove1314 2008-08-05
  • 打赏
  • 举报
回复
...新人先进来膜拜,。,。。。
BillMhw 2008-08-05
  • 打赏
  • 举报
回复
Pa实现了接口II,因此显示in Pa
cadust 2008-08-05
  • 打赏
  • 举报
回复
因为Ch.Show是对Pa.Show的覆盖,所以相对于Pa,Ch.Show是不可见的。
因此通过接口II调用Show的时候逆向找寻到Pa.Show就走到头了
ztenv 2008-08-05
  • 打赏
  • 举报
回复
sorry ,错了,
ztenv 2008-08-05
  • 打赏
  • 举报
回复
如果编译器强制加个new感觉会更好一点.
catpk 2008-08-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wackyboy 的回复:]
hidden 了
new的Ch对象里有两个show方法,一个是他自己的即show Ch,另一个是他的父类的即show Pa,
当调用子类的show的时候只调用子类的,不会调用父类的,也就是说子类将父类的方法隐藏了。
当子类的对象赋给父类的变量的时候,因为父类的变量只认识他自己的方法,所以就调用父类的show,结果是show Pa
[/Quote]
[Quote=引用 1 楼 FlashElf 的回复:]
因为声明的类型是II, Pa 实现了接口 II

而 Ch虽然是集成 pa 但是 show 并不是重写 Pa 所以.....就显示 in Pa 了啊;
[/Quote]
正解
  • 打赏
  • 举报
回复
这就是c#编译器中我比较的一点 --> 这就是c#编译器中我比较反感的一点问题

这应该不算一个BUG,而是一个Design问题。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lhy011 的回复:]
new关键字可以不写,但是编译的时候会给出警告。
[/Quote]

这就是c#编译器中我比较的一点,它优先兼容非OO做法。如果要继承,必须在Pa中写上virtual,在Ch中写上override,反而麻烦。而最简单的写法竟然是编译为反OO风格的那种机制,因此相当不方便。
zhu660 2008-08-05
  • 打赏
  • 举报
回复
好高深啊,我是一丁点都看不懂,我是新人,我的路还长的很啊!
lhy011 2008-08-05
  • 打赏
  • 举报
回复
这个题目考察的是"重写和覆盖的区别"

重写(override)体现的是继承
而覆盖(new)体现的是“取代”,new关键字可以不写,但是编译的时候会给出警告。
通俗的讲:
重写就是发表声明说:为了与时俱进,我需要在做事方式上做一定改进,我仍然是这个团体中的一份子!!
覆盖就是发表声明说:别看我们有相同的名字,我们根本不是一回事,以后这个团体(实例)中的相关事物都是我说了算,这个名字就我用了,你呢,前面加super.!

回到本题
II ii = new Ch(); //ch实例化接口的引用
ii.show(); //通过接口调用show

接口只能调用接口中定义了的事件,ii在show的时候,会调用子类ch中从pa中继承而来的show方法,也就是super.show(),所以输出in Pa
amandag 2008-08-04
  • 打赏
  • 举报
回复
ch这个show方法是他自己独有的,对于父类Pa是隐藏的,而实现接口的show方法是Pa类的show方法
曲滨_銘龘鶽 2008-08-04
  • 打赏
  • 举报
回复
因为声明的类型是II, Pa 实现了接口 II

而 Ch虽然是集成 pa 但是 show 并不是重写 Pa 所以.....就显示 in Pa 了啊;

110,536

社区成员

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

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

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