首页 新闻 搜索 专区 学院

方法的重写和隐藏 如何被调用的

0
[待解决问题]

有如下的代码

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

    public virtual void Fun3()
    {
        Console.WriteLine("2");
    }
    public void Fun2()   
    {       
        Fun3();
    }
}
public class B : A
{
    public new void Fun3()
    {
        Fun1();
    }

    public override void Fun1()
    {
        Console.WriteLine("3");
    }
   
}

实例化类B后调用Fun2,输出结果是2

 B b = new B();
        b.Fun2();

 

如果把B类的的 Fun3()的new 修饰符修改成 override 则结果是3

我不理解的是

public void Fun2()   
    {       
        Fun3();
    }

方法Fun2中对于 Fun3 是一个什么样的调用机制

是否能看到方法在调用过程中的IL代码,谢谢

wanglgkaka的主页 wanglgkaka | 菜鸟二级 | 园豆:218
提问于:2014-08-28 12:03
< >
分享
所有回答(2)
0

http://www.cnblogs.com/f1194361820/p/3897999.html

这篇博客应该可以帮到你的

乐享程序员 | 园豆:930 (小虾三级) | 2014-08-28 12:18
0

凡是使用this(默认不带this)的方法、属性都是当前实体能直接调用(访问)的。

1、当你在B中对fun3使用new后,那么new后的fun3不是类A中的fun2能访问的,所以,此时输出的结果是2(类A中Fun3的执行)。

2、当你把B对fun3的new去掉后,这个时候,fun3被重载,此时fun2调用的是重载后的fun3,也就是类B中的fun3,也就转而调用了fun1。

3、同理,类B的fun3里调用fun1时,无论fun1是否new,都会调用类B里的fun1,也就输出了3

4、如果,你在类B的fun3里把fun1的调用修改为:base.Fun1(),则输出的是类A里的结果。

519740105 | 园豆:5810 (大侠五级) | 2014-08-28 13:06

这个问题你可以参考下:http://q.cnblogs.com/q/64766/

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-28 13:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册