【C#】什么时候使用virtual什么时候使用abstract,(另附override/new区别)

一、C#中virtual与abstract的区别(引用“姓吕名布字子乔”的文章)

C#的virtual & abstract经常让人混淆,这两个限定词都是为了让子类进行重新定义,覆盖父类的定义。但是用法上差别很大。

a)     virtual修饰的方法必须有方法实现(哪怕只有一对大括号),abstract修饰的方法不能有实现。

b)    virtual可以被子类重写,abstract必须被子类重写

c)     如果类中的某一函数被abstact修饰,则类名也必须用abstact修饰

d)    Abstract修饰的类不能被创建实例。

e)     C#中如果准备在子类重写父类的方法,则该方法在父类中必须用virtual修饰,在子类中必须用overide修饰,避免了程序员在子类中不小心重写了父类父类方法。

注:用abstract修饰的类只能被继承不能够被实例化。

二、什么时候使用virtual什么时候使用abstract

a)  virtual重点是实现多态,同一个方法能做不同的事情,也就是当一个方法会有不同的操作的时候要用virtual,例如:支付方法 pay(),可能通过微信去支付、也可能通过支付宝或者其他方式去支付,这个时候定义pay()方法的时候最好是用virtual修饰。

b) 作为一个必须存在的方法的时候用abstract,比如要定义一个人类对象Class Person{}和一个鸟类对象Class Bird{},人是动物,鸟也是动物,所以一般会先定义一个共同的基类Class animal{},然后让人类和鸟类对象都继承这个基类。这个基类可以有共通的属性和方法,比如行走方法walk(),发声方法voice(),在基类中这两个方法都是不需要实现的,只需要在PersonBird类中实现就可以了【Person和Bird类必需要实现这两个方法,这也保证了所有继承animal类的类都需要有walk()和voice()方法】,所以定义walk()voice()方法的时候可以用abstract修饰

 

附、override/new区别

Base b1 = new Base();
A a = new A();
Base b2 = new A();//关键是这行代码

//以下4行代码输出的跟你预想的完全一样
var b1Foo1 = b1.Foo1(); //输出 base1 
var b1Foo2 = b1.Foo2(); //输出 base2 
var nFoo1 = a.Foo1(); //输出 Override 
var nFoo2 = a.Foo2(); //输出 New 

//但下面两行可能会有点区别   
var b2Foo1 = b2.Foo1(); //Override   (override:b2虽是Base,但在A类里重写了Foo1方法,所以调用的是A.Foo1())
var b2Foo2 = b2.Foo2(); //base2      (new:b2是Base,但在A类里并没有重写Foo2方法,所以调用的是Base.Foo1())

//总结:当基类对象实例化的是派生类,则:
//1、函数用override修饰,则调用的就是派生类里的函数;
//2、函数用new修饰,则调用的依然是基类里的函数,因为 new表示是新的函数,跟基类里同名的那个函数没有任何关系
public class A : Base
    {
        public override string Foo1()
        {
            return "Override";
        }
        public new string Foo2()
        {
            return "New";
        }
    }

    public class Base 
    {
        public virtual string Foo1()
        {
            return "base1";
        }
        public virtual string Foo2()
        {
            return "base2";
        }
    }
View Code

 

转载于:https://www.cnblogs.com/stgp/p/6233359.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值