C#虚方法和抽象方法的区别
一,如下例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DemoTest { class Program { static void Main(string[] args) { B a = new B(); } } public class A { public A() { Say(); } protected virtual void Say() { Console.WriteLine("A"); } } public class B : A { protected override void Say() { Console.Write("B"); } } }
结果:
输出的则是B
二,通过调试得出结论:
当B继承A时,并重写A中的方法,程序运行的时只会进入到B中重写的方法Say(),而不会进入A中的Say()
三,抽象方法和虚方法的区别
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace abstractOrvirtual { class Program { static void Main(string[] args) { AbstractDemo ab = new Test(); ab.AbstractEvent(); ab.VirtualEvent(); ab.VirtualEvent2(); } } public abstract class AbstractDemo { public abstract void AbstractEvent(); //public abstract void AbstractEvent2() //无法声明主体,因为它标记为 abstract //{ // Console.WriteLine("抽象方法"); //} public virtual void VirtualEvent() { Console.WriteLine("虚方法"); } public virtual void VirtualEvent2() { Console.WriteLine("虚方法"); } // public virtual void VirtualEvent2();必须声明主体,因为它未标记为 abstract、extern 或 partial } public class Test : AbstractDemo { public override void AbstractEvent() //抽象方法可以被重写 { Console.WriteLine("抽象方法"); } public virtual void VirtualEvent2()//虚方法可以被重写 { Console.WriteLine("虚方法2"); } } }