注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

神魔破杜梓的叨叨堂

Programming every day!

 
 
 

日志

 
 
 
 

自己研究了一下C#的多态  

2007-11-21 12:30:47|  分类: My Tech |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

class Program
    {
        static void Main(string[] args)
        {
            parent p = new son();
            p.foo();
            p.foo1();
            Console.ReadLine();
        }
    }
   
    class parent
    {
        public virtual void foo()
        {
            Console.WriteLine("foo from parent");
        }
       
        public void foo1()
        {
            Console.WriteLine("foo1 from parent");
        }
    }

    class son:parent
    {
        public override void foo()
        {
            Console.WriteLine("foo from son");
        }

        public new void foo1()
        {
            Console.WriteLine("foo1 from son");
        }
    }

 

返回:

foo from son

foo1 from parent

 

原因:parent p = new son();

可以拆解为:

son s = new son();

parent p = (parent)s;

因为p 是由s转换来的,而且s中的foo进行了重写,实际上p.foo() === s.foo() (可以这样理解,此处p.foo()函数实际上调用的是s.foo(),因为实例还是son的实例)所以会调用s.foo();

注意此处p应该还是为son的实例,只不过因为类型转换,其foo1()的函数入口点变成了parent.foo1()的函数入口点,所以调用foo1的时候会调用parent.foo1()。

结论:

子类如果没有重写父类的方法,则将子类实例的类型转换为父类时,子类的函数入口点会被父类的函数入口点所替代。

参考资料:来自MSDN

为了使派生类的实例完全接替来自基类的类成员,基类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加 virtual 关键字来实现的。然后,派生类可以选择使用 override 关键字而不是 new,将基类实现替换为它自己的实现。

贴上reflector的il代码:

.method private hidebysig static void Main(string[] args) cil managed  {      .entrypoint      .maxstack 1      .locals init (          [0] class ConsoleApplication2.parent p)      L_0000: nop       L_0001: newobj instance void ConsoleApplication2.son::.ctor()      L_0006: stloc.0       L_0007: ldloc.0       L_0008: callvirt instance void ConsoleApplication2.parent::foo()      L_000d: nop       L_000e: ldloc.0       L_000f: callvirt instance void ConsoleApplication2.parent::foo1()      L_0014: nop       L_0015: call string [mscorlib]System.Console::ReadLine()      L_001a: pop       L_001b: ret   }  

  评论这张
 
阅读(429)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017