添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。

它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的。毕竟加上virtual或abstract就是让子类重新定义的,而private成员是不能被子类访问的。

但是它们的区别很大。(virtual是“虚拟的”,abstract是“抽象的").

(1)virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不能实现。如对于virtual修饰的方法如果没有实现:

        public class Test1
            public virtual void fun1();

错误    2    “Test1.fun1()”必须声明主体,因为它未标记为 abstract、extern 或 partial   

对于abstract修饰的方法如果有实现:

        public abstract class Test2
            public abstract void fun2() { }

错误    1    “Test2.fun2()”无法声明主体,因为它标记为 abstract   

(2)virtual可以被子类重写,而abstract必须被子类重写,

//public override void fun();错误1:没有实现 //public void fun() { } 错误2:重写时没有添加override //override void fun() { }错误3:虚拟成员或者抽象成员不能是私有的(只要在父类中声明了虚拟成员或抽象成员,即便是继承的也要加上这个限制) public override void fun() { }//如果重写方法; 错误:“A.DeriveTest2”不实现继承的抽象成员“A.BaseTest2.fun()”

(3)如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。

(4)无法创建abstract类的实例,只能被继承无法实例化,比如:     BaseTest2 base2 = new BaseTest2();将出现编译错误:抽象类或接口不能创建实例。
(5)C#中如果要在子类中重写方法,必须在父类方法前加virtual,在子类方法前添加override,这样就避免了程序员在子类中不小心重写了父类方法。

(6)abstract方法必须重写,virtual方法必须有实现(即便它是在abstract类中定义的方法).

//public virtual void Prinf();错误:virtual方法必须有实现 public virtual void Prinf() //abstract类的virtual方法可以不重写;abstract方法必须重写。 Console.WriteLine("Abstract Printf..."); public class Class1 : Test public override void Prinf() //派生类中不重写abstract类的virtual方法照样可以运行,不过调用派生类对象的Printf方法时,调用的是父类的。 Console.WriteLine("Class One Override Printf..."); 代码如下: class A { public virtual void Func() // 注意virtual,表明这是一个虚拟函数 { Console.WriteLine(“Func In A”); } } class B : A // 注意B是从A类继承,所以A是父类,B是子类 { public override void Func() // 注意override ,表明重新实现了虚函数 { Console.WriteLine(“Func In B”); } } class C : B // 注意C是从B类继承,所以B是父类,C是子类 { } class D : A // 注意D是从A类继 继承过程的疑难杂症(四,(Virtual)虚拟与(abstract)抽象) 在上篇我们讲解了override(重写)与overload(重载),里面涉及到了虚拟方法和抽象方法,所以我们现在重点把(Virtual)虚拟与(abstract)抽象,在这里给大家详细讲解一下 override(重写)与overload(重载)详解 一,(Virtual)虚拟 在 C# 语言virtual是虚拟的含义,默认情况下类的成员都是非虚拟的. 我们将类的成员定义成虚拟的,表示这些成员将会在继承后重写其的内容。 1.abstract修饰类: 表示这个类是抽象类,抽象类并不能被实例化,只能被继承。抽象类可以包括抽象方法和非抽象方法。 抽象类也可以包括实例成员,并且实例成员在子类可以不被实现。 抽象类是可以有构造函数的。 2.abstract修饰方法: 抽象方法在抽象类之的时候方法只能做出声明,方法主体不能写出来,并且(所有... virtualabstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。 1.virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号), 而abstract修饰的方法一定不能实现。 2.virtual可以被子类重写,而abstract必须被子类重写。 3.如果类成员被abstract修饰,则该类前必须添加abstract, 因为只有抽象类才可以有抽象方法。 4.无法创建abstract类的实例,只能被继承无法实例化。 重载和重写 重载(overload)是提供了一种机制, c# AbstractVirtual比较容易混淆,都与继承有关,并且涉及override的使用。下面讨论一下二者的区别: 一、Virtual方法(虚方法)   virtual 关键字用于在基类修饰方法。virtual的使用会有两种情况:  情况1:在基类定义了virtual方法,但在派生类没有重写该虚方法。那么在对派生类实例的调用,该虚方法使用的是基类定义的方法。  情况2:在基... 情况2:在基类定义了virtual方法,然后在派生类使用override重写该方法。那么在对派生类实例的调用,该虚方法使用的是派生重写的方法。情况1:在基类定义了virtual方法,但在派生类没有重写该虚方法。那么在对派生类实例的调用,该虚方法使用的是基类定义的方法。和Virtual比较容易混淆,都与继承有关,并且涉及override的使用。,并且没有具体的实现。抽象方法的实现必须在派生类使用override关键字来实现。关键字用于在基类修饰方法。abstract关键字。