浅谈C#接口

发表于:2011-12-23 09:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佳园    来源:51Testing软件测试网采编

分享:

  通过断点,可以看到,当执行pro.Fun();时,首先会跳到接口的实现方法里,然后去调用抽象函数的实现方法,当抽象函数的方法实现后,再回到接口的实现方法,直到执行完成。

  当我们在实现接口的方法里调用虚函数呢?

interface IProgram
    {
        void Fun();
    }
    class AProgram : IProgram
    {
        public virtual void AFun()    //注意这里是虚函数
        {
            Console.WriteLine("I am virtual AFun.");
        }
        void IProgram.Fun()
        {
            AFun();
        }
    }
    class Program:AProgram
    {
        public override void AFun()  //这里是Override重写
        {
            Console.WriteLine("I am override AFun.");
        }
        static void Main(string[] args)
        {
            IProgram pro = new Program();
            pro.Fun();
            Console.Read();
        }
    }

  这时,我们发现,执行的顺序和上一个例子是相同的。所以结果为:I am override AFun.

  由此,我们可以继续联想,当我们把override关键字,换成new呢?是不是也是同样的结果,还是和我们以前讲的例子一样,是隐藏呢?

  我们把上面的例子进行改进:

interface IProgram
    {
        void Fun();
    }
    class AProgram : IProgram
    {
        public virtual void AFun()
        {
            Console.WriteLine("I am virtual AFun.");
        }
        void IProgram.Fun()
        {
            AFun();
        }
    }
    class Program:AProgram
    {
        public new void AFun()
        {
            Console.WriteLine("I am new AFun.");
        }
        static void Main(string[] args)
        {
            Program pro = new Program();
            ((IProgram)pro).Fun();
            pro.AFun();
            Console.Read();
        }
    }

  结果为:I am virtual AFun.

                  I am new AFun.

43/4<1234>
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号