C#中的虚类、密封类、抽象类

虚方法:

1、virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑. 
2、virtual方法可以直接使用,和普通方法一样 
3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写

virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别 
相应的 
sealed关键字标示此方法不可以被重写

虚方法和抽象方法的区别:

1.虚方法可以有实现体,抽象方法不能有实现体。

2.抽象方法
    要求派生类必须重载这个方法;


虚方法
    告诉编译器,这个方法可以重写。
    当基类的方法与派生类的方法重名时,
    可以选择派生类的方法从基类继承并重写,
    还是,把基类的方法隐藏起来。

本段来自CSDN博客:http://blog.csdn.net/tflb521/archive/2009/08/20/4466134.aspx


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

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

例子:

 
  
  1. using System;
  2. class A
  3. {
  4. public void F(){Console.WriteLine("A.F");}
  5. public virtual void G(){Console.WriteLine("A.G");}
  6. }
  7. class B:A
  8. {
  9. new public void F(){Console.WriteLine("B.F");}
  10. public override void G(){Console.WriteLine("B.G");}
  11. }
  12. class Test
  13. {
  14. static void Main()
  15. {
  16. B b=new B();
  17. A a=b;
  18. a.F();
  19. b.F();
  20. a.G();
  21. b.G();
  22. }
  23. }

例子中,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完成了对方法的实际调用。

你可能感兴趣的:(C#)