c#:浅析抽象方法与虚方法的区别

c#:浅析抽象方法与虚方法的区别


在c#中,abstract关键字修饰的方法 (抽象方法)virtual关键字修饰的方法 (虚方法) 都可以供派生类来重写它们所在基类中所修饰的方法,那么它们之间有什么区别呢?,来让我们一起来看看他们的特点吧 GO! GO! GO!

一、abstract关键字

​ 1、被abstract关键字修饰的方法被称为抽象方法

​ 2、抽象方法所在的类必须为抽象类,但是抽象类中可以没有抽象方法
c#:浅析抽象方法与虚方法的区别_第1张图片

  abstract class Animal//抽象动物类
    {
        public int Weight { get; set; }//实例属性
        public void weight(int a)//实例方法
        {
            this.Weight = a;//将获取到的只给体重属性
            Console.WriteLine("体重为:{0}", this.Weight);//打印体重
        }
        public abstract void Eat();//抽象方法吃,没有方法体,直接以分号结束
        
    }

​ 3、被abstract关键字修饰的类(抽象类)不能使用new关键字来实例化
c#:浅析抽象方法与虚方法的区别_第2张图片
​ 4、抽象方法没有提供实现部分,也就是说它没有方法体,直接以分号结尾

public abstract void Eat();//抽象方法吃,没有方法体,直接以分号结束

​ 5、如果有类继承了抽象类,那么此派生类就必须重写(实现)抽象基类中的所有抽象方法,也就是说,抽象方法是一种强制派生类重写基类抽象方法的方法。

  class Cat : Animal//猫类继承了抽象动物类
    {
        public override void Eat()//此时就必须应该重写抽象类中的抽象方法(实现)
        {
            Console.WriteLine("我吃鱼");
        }
    }

​ 6、如果有一个类继承了抽象类,但是没有实现基类的抽象方法,那么此派生类也必须是抽象类,同时也必须有重写关键字override

 abstract class Cat : Animal//抽象猫类继承了抽象动物类
    {
        public abstract override void  Eat();//派生类抽象方法重写基类抽象方法,等于没有实现
    }

​ 7、抽象方法不能使用private、static、sealed、virtual……等修饰符


二、virtual关键字

​ 1、被virtual关键字修饰的方法称之为虚方法

​ 2、虚方法必须有实现部分,并为派生类提供了重写该方法的选项,也就是说虚方法必须有方法体
c#:浅析抽象方法与虚方法的区别_第3张图片

 public virtual void Eat()
 {      
     
 }//抽象方法吃

​ 3、派生类可以重写基类的虚方法,也可以不去重写,同时还可以隐藏基类的虚方法也就是根据自己的实际需求而定

(1)重写:

 //基类
 class Animal
    {
        public virtual void Eat()//虚方法,必须要有实体
        { 
        
        }
    }
//派生类
 class Cat : Animal
    {
        public override void Eat()
        { 
        }
    }

(2)不重写

​ 如果说不重写的话,那就直接继承使用基类的方法,没有必要再写了,而且没有override重写关键字就会有警告,所以我建议,不重写的话就不要写了,直接继承使用基类的方法就好

(3)隐藏基类虚方法

//基类
class Animal
    {
        public virtual void Eat()//虚方法
        {
            Console.WriteLine("我是基类的方法");
        }
    }
//派生类
  class Cat : Animal
    {
        public new void  Eat()//通过new关键字隐藏基类的虚方法
        {
            Console.WriteLine("我是派生类的方法");
        }
    }

​ 4、虚方法所在了类可以通过new关键字来实例化,但所在的列不能声明为static

​ 5、被virtual关键字修饰的虚方法不能再声明private、static、abstract、override……等关键字


三、总结

​ 通过以上的描述,我想大家应该都了解了一点抽象方法与虚方法的不同点,但是为了大家能够更直观的来了解到他们的不同点,我将他们的不同点以表格的形式展示给大家,希望大家能够更直观的感受到他们的不同之处

不同点:

抽象方法(abstract) 虚方法(virtual)
抽象方法所在的类必须声明为抽象类 virtual只能用来修饰方法,不能修饰类
抽象方法所在的类,不能通过new进行实例化 虚方法所在的类可以通过new进行实例化
抽象方法必须不能有方法体 虚方法必须有方法体
派生类必须重写基类(抽象类)中的所有抽象方法,并且派生类不能通过new来隐藏基类的抽象方法 派生类可以不重写基类的虚方法,同时还可以通过new来隐藏基类的虚方法
抽象方法不能使用private、static、sealed、virtual……等修饰符 虚方法不能使用private、static、abstract、override……等修饰符

法 | 派生类可以不重写基类的虚方法,同时还可以通过new来隐藏基类的虚方法 |
| 抽象方法不能使用private、static、sealed、virtual……等修饰符 | 虚方法不能使用private、static、abstract、override……等修饰符 |

以上均是个人在学习c#关键字的一些体会与总结,希望可以帮到您,如果本篇文章有不完善的地方,还请各位朋友能够多多指点,谢谢!

你可能感兴趣的:(IT)