首页 新闻 会员 周边 捐助

C#基础知识,关于隐式继承

0
悬赏园豆:10 [已解决问题] 解决于 2009-05-25 20:09

直接看代码

基类

Code
class BasicClass
{
public virtual void VirtualMethod()
{
//.
}

public void NewMethod()
{
//.
}
}

继承类

Code
class ExtendClass:BasicClass
{
public override void VirtualMethod()
{
//..
}


public new void NewlMethod()
{
//..
}
}

Main

Code
class MainClass
{
static void Main(string[] agrs)
{
BasicClass c
= new ExtendClass();
c.VirtualMethod();
c.NewMethod();
}
}

问题来了,在main中,

调用VirtualMethod时,调用的是继承类种重写的方法.

而调用隐式继承NewMethod时,则是调用的基类中的方法.

 

为什么呢?

指针为空的主页 指针为空 | 初学一级 | 园豆:160
提问于:2009-05-24 12:06
< >
分享
最佳答案
1

因为你在ExtendClass中使用了new关键字

new关键字的作用是打断继承链

因此当你调用c.NewMethod()时,从BasicClass(编译期类型)开始延继承链查找,目标是运行期 类型(你的示例中就是ExtendClass),查找这条链上的所有NewMethod的实现

但是发现ExtendClass中使用的是new,因此继承链在ExtendClass的上一级停止,也就是停在了BasicClass中,调用了BasicClass的方法

 

你可以试试把ExtendClass的NewMethod的new去掉

然后加第三个类

public class ThirdClass : ExtendClass {

    public new void NewMethod() { //... }

}

Main函数中写

BasicClass c = new ThirdClass();

c.NewMethod();

如果我没理解错,你应该会发现调用的依旧是ExtendClass,这是因为在ThirdClass中打断继承链,因此方法继承链停在ThirdClass的上一级,也就是ExtendClass

Gray Zhang | 专家六级 |园豆:17610 | 2009-05-24 15:54
其他回答(2)
0

因为你使用的是 BasicClass.你换成ExtendClass 看看.

Launcher | 园豆:45050 (高人七级) | 2009-05-24 15:08
0

因为用了override,所以指向子类的函数入口地址。

那个new的,你必须用子类类型去调用才能调用得到的,用父类类型调用,还是父类的方法。

hoodlum1980 | 园豆:573 (小虾三级) | 2009-05-25 10:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册