有关接口的一些疑问

wk123_11 2008-12-13 10:36:02
interface IMsg
{
void Message();
}

public class MyClass : IMsg
{
public void Message()
{
Console.WriteLine("MyClass" );
}
}

public class MyDerivedClass : MyClass
{
public new void Message()
{
Console.WriteLine( "MyDerivedClass" );
}
}

public class test
{
static void Main()
{
MyDerivedClass d = new MyDerivedClass( );
d.Message( ); // prints "MyDerivedClass"
IMsg m = d as IMsg;
m.Message( ); // prints "MyClass"
}
}

请问为什么m是指向Myclass中的message方法? d对象中Myclass的message方法不是被隐藏了吗?

...全文
111 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤剑 2008-12-13
  • 打赏
  • 举报
回复
public class MyDerivedClass : MyClass
{
public new void Message()
{
Console.WriteLine( "MyDerivedClass" );
}
}


关键是 new 的问题,在方法定义时使用 new 就相当于一个新的方法,与IMsg 中的Message() 没有一点关系的,只不过是名称与 IMsg.Message() 相同而已,
只是 MyDerivedClass 的方法名称与 IMsg 中方法名称一样,简单点直接:

public class MyDerivedClass : MyClass
{
public void NewMessage()
{
Console.WriteLine( "MyDerivedClass" );
}
}
zjybushiren88888 2008-12-13
  • 打赏
  • 举报
回复
子类不会再实现基类的接口!
huangkuncheng 2008-12-13
  • 打赏
  • 举报
回复
up
net5i 2008-12-13
  • 打赏
  • 举报
回复
再说得明白一些吧,对于类似:IMsg m = d as IMsg;这样接口实例转换,
转换的结果对象是接口的实现者,而不是接口的实现者的任何子类。
wk123_11 2008-12-13
  • 打赏
  • 举报
回复
谢谢net5i ~ 原来是这样..
net5i 2008-12-13
  • 打赏
  • 举报
回复
也就是说子类不会再实现基类的接口了,但是子类也属于基类的接口

有点拗口,搂主还是自己找资料学习吧,上面仅仅是我的个人理解
net5i 2008-12-13
  • 打赏
  • 举报
回复
MyDerivedClass类已经不再受IMsg接口的制约啦,当你 IMsg m = d as IMsg;其实是把d的基类转换给m啦
所以m是指向Myclass中的message方法

所以,搂主把MyDerivedClass 类中的Message方法去掉也是没关系的

接口的特性,搂主需要再去学习

110,536

社区成员

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

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

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