C#中 virtual 和 abstract 区别

本文对比了virtual虚函数与abstract抽象方法的区别,包括修饰符使用、方法主体、子类重写等方面,并举例说明了两者在继承场景中的应用。

1、这两个都是用来修饰类和方法的
2、都不能用private修饰
3、virtual 虚拟 abstract 抽象

4、virtual修饰的方法必须有主体
而且子类可以不去实现这个方法
如果子类不重写这个虚函数 在子类里调用这个方法调用的是父类里的
5、abstract修饰的方法不能有主体
子类必须重写这个方法
抽象方法必须包含在抽象类里

虚函数的应用:
A a=new B(); //A是父类,B 是子类
a.fuc();
if(B里 重写了A里 的虚函数 )
{
a.fuc()里调用的就是B里的fuc();
}
else
{
a.fuc()里调用的就是A里的fuc();
}

抽象函数的应用:
因为子类必须重写抽象函数 ,而且父类抽象函数不能有主体
A a=new B();
所以 a.fuc() 只能调用的是B里的函数

更新中 未完成。。。

### C# 中 `virtual` `abstract` 关键字区别 #### 定义与特性 - **Virtual 方法**:通过 `virtual` 关键字可以修改方法、属性、索引器或事件声明,允许派生类对其进行重写。这表示任何继承该成员的类都可以提供自己的实现方式[^2]。 ```csharp public class BaseClass { public virtual void DisplayMessage() { Console.WriteLine("Base Class Message"); } } public class DerivedClass : BaseClass { public override void DisplayMessage() { Console.WriteLine("Derived Class Message"); } } ``` - **Abstract 方法**:隐含地是一个虚拟的方法,因此不需要显式地标记为 `virtual` 。此类方法仅定义签名而不给出具体实现;它强制要求所有的非抽象子类都必须覆盖此方法并提供具体的逻辑[^1][^3]。 ```csharp public abstract class AbstractClass { public abstract void ShowDetails(); } public class ConcreteClass : AbstractClass { public override void ShowDetails() { Console.WriteLine("Concrete Implementation Details"); } } ``` #### 使用场景 对于何时应该选用哪种机制,则取决于设计意图: - 如果希望给定默认行为但仍让后代有机会改变这种行为的话,那么就应当采用 `virtual` 成员。 - 当创建框架或者库的时候,如果某些功能必须要由使用者来完成而不能提前确定其实现细节时,就应该考虑使用 `abstract` 类及其成员[^4]。 #### 静态上下文中不可用 值得注意的是,在抽象方法声明中不允许使用静态(`static`)修饰符,因为这些方法本质上就是要被实例化后的对象所调用,并且它们总是会被其子类中的相应版本替换掉。同样地,由于已经自动具备了可覆写的性质,故也不应再额外加上 `virtual` 限定词[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值