A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 卖火柴 中级黑马   /  2014-1-16 09:44  /  1422 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

     C#虚拟方法 :入学面试被问到的啊~!

      当类中的方法声明前加上了virtual修饰符,我们称之为C#虚拟方法 ,反之为非虚。使用了virtual修饰符后,不允许再有static、abstract或override修饰符。对于非虚的方法,无论被其所在类的实例调用,还是被这个类的派生类的实例调用,方法的执行方式不变。而对于虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。

    下面的例子说明了C#虚拟方法与非虚方法的区别。

    例子:

  • using System;
  • class A
  • {
  •    public void F(){Console.WriteLine("A.F");}
  •    public virtual void G(){Console.WriteLine("A.G");}
  • }
  • class B:A
  • {
  •    new public void F(){Console.WriteLine("B.F");}
  •    public override void G(){Console.WriteLine("B.G");}
  • }
  • class Test
  • {
  •    static void Main()
  •    {
  •       B b=new B();
  •       A a=b;
  •       a.F();
  •       b.F();
  •       a.G();
  •       b.G();
  •    }
  • }

    例子中,A类提供了两个方法:非虚的F和C#虚拟方法 G.类B则提供了一个新的非虚的方法F,从而覆盖了继承的F;类B同时还重载了继承的方法G.那么输出应该是:

    A.F

    B.F

    B.G

    B.G

    注意到本例中,方法a.G()实际调用了B.G,而不是A.G.这是因为编译时值为A,但运行时值为B,所以B完成了对方法的实际调用。




2 个回复

倒序浏览
值得学习和收藏!
回复 使用道具 举报
楼上正解,CSDN上面讲的很清楚
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马