C#中virtual(虚方法)的理解以及和abstract(抽象方法)的区别

Virtual方法(虚方法)

     virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:

     情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。

     情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。

代码如下:

namespace VirtualTestApplication
{
 public class A
 {
     public virtual string print()
     {
         return "我是A类";
     }
  }

  public class B : A
  {

  }

  public class C : A
  {
    public override string print()
    {
      return "我是C类";
    }
  }
}

再在主程序入口调用方法:

static void Main(string[] args)
 {
       B b = new B();
       C c = new C();
       Console.WriteLine(b.print());
       Console.WriteLine(c.print());
       Console.ReadKey();
 }

运行结果:

virtual和abstract的异同点:

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

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

不同点:

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

public class Test1
{
    public virtual void fun1();
}

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

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

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

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

 

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

class BaseTest1
{
    public virtual void fun() { }    // 必须有实现
}

class DeriveTest1:BaseTest1
{
    //public override void fun() { }
}

编译不会出现错误,如果重写了virtual修饰的方法,前面必须添加override(这样就告诉了编译器你要重写虚拟方法),而且必须有实现,否则编译出错;

abstract class BaseTest2
{
    public abstract void fun();
}

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

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

4、无法创建abstract类的实例,只能被继承无法实例化,比如:BaseTest2 base2 = new BaseTest2();将出现编译错误:抽象类或接口不能创建实例。

5、C#中如果要在子类中重写方法,必须在父类方法前加virtual,在子类方法前添加override,这样就避免了程序员在子类中不小心重写了父类方法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值