在c#中,abstract关键字修饰的方法 (抽象方法) 与 virtual关键字修饰的方法 (虚方法) 都可以供派生类来重写它们所在基类中所修饰的方法,那么它们之间有什么区别呢?,来让我们一起来看看他们的特点吧 GO! GO! GO!
1、被abstract关键字修饰的方法被称为抽象方法
2、抽象方法所在的类必须为抽象类,但是抽象类中可以没有抽象方法
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关键字来实例化
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……等修饰符
1、被virtual关键字修饰的方法称之为虚方法
2、虚方法必须有实现部分,并为派生类提供了重写该方法的选项,也就是说虚方法必须有方法体
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#关键字的一些体会与总结,希望可以帮到您,如果本篇文章有不完善的地方,还请各位朋友能够多多指点,谢谢!