C#虚方法和抽象方法

C#中的虚方法和抽象方法 虚方法和抽象方法都是实现多态性和继承的重要工具。在实际的软件设计中,根据需求和设计目标的不同,我们可以选择使用虚方法或抽象方法来组织C# 中的虚方法和抽象方法。根据需求和设计目标的不同,我们可以选择使用虚方法或抽象方法来组织代码和实现灵活的对象行为。由于抽象方法必须在派生类中被重写,所以实际调用的是派生类中的具体实现。由于抽象方法必须在派生类中被重写,所以实际调用的是派生类中的具体实现。方法是虚方法,所以实际调用的是派生类中的重写方法。方法是虚方法,所以实际调用的是派生类中的重写方法。方法被标记为虚方法。 阅读详情

虚方法:

1、virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑.
2、virtual方法可以直接使用,和普通方法一样
3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写

virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别
相应的
sealed关键字标示此方法不可以被重写

虚方法和抽象方法的区别:

1.虚方法可以有实现体,抽象方法不能有实现体。

2.抽象方法
    要求派生类必须重载这个方法;


虚方法
    告诉编译器,这个方法可以重写。
    当基类的方法与派生类的方法重名时,
    可以选择派生类的方法从基类继承并重写,
    还是,把基类的方法隐藏起来。 


本段来自优快云博客:http://blog.youkuaiyun.com/tflb521/archive/2009/08/20/4466134.aspx

 

 

c#虚方法详解:在派生类中的应用

 

若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚拟方法。若其中没有 virtual 修饰符,则称该方法为非虚拟方法。

非虚拟方法的实现是不会变的:无论是在声明它的类的实例上调用该方法还是在派生类的实例上调用,实现都是相同的。与此相反,一个虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法(第 10.5.4 节)。

在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。在非虚拟方法调用中,相关的实例的编译时类型是决定性因素。准确地说,当在具有编译时类型 C 和运行时类型 R 的实例(其中 R 为 C 或者从 C 派生的类)上用参数列表 A 调用名为 N 的方法时,调用按下述规则处理:

•首先,将重载决策应用于 C、N 和 A,以从在 C 中声明的和由 C 继承的方法集中选择一个特定的方法 M。第 7.5.5.1 节对此进行了描述。
•然后,如果 M 为非虚拟方法,则调用 M。
•否则(M 为虚拟方法),就会调用就 R 而言 M 的派生程度最大的那个实现。
对于在一个类中声明的或者由类继承的每个虚拟方法,存在一个就该类而言的派生程度最大的实现。就类 R 而言虚拟方法 M 的派生度最大的实现按下述规则确定:

•如果 R 中含有关于 M 的 virtual 声明,则这是 M 的派生程度最大的实现。
•否则,如果 R 中含有关于 M 的 override 声明,则这是 M 的派生程度最大的实现。
•否则,就 R 而言 M 的派生程度最大的实现与就 R 的直接基类而言 M 的派生程度最大的实现相同。
下列实例阐释虚拟方法和非虚拟方法之间的区别:

using System;
class A
{
   public void F() { Console.WriteLine("A.F"); }
   public virtual void G() { Console.WriteLine("A.G"); }
}
class B: A
{
   new public void F() { Console.WriteLine("B.F"); }
   public override void G() { Console.WriteLine("B.G"); }
}
class Test
{
   static void Main() {
      B b = new B();
      A a = b;
      a.F();
      b.F();
      a.G();
      b.G();
   }
}在该示例中,A 引入一个非虚拟方法 F 和一个虚拟方法 G。类 B 引入一个新的非虚拟方法 F,从而隐藏了继承的 F,并且还重写了继承的方法 G。此例产生输出:

A.F
B.F
B.G
B.G请注意,语句 a.G() 实际调用的是 B.G 而不是 A.G。这是因为,对调用哪个实际方法实现起决定作用的是该实例的运行时类型(即 B),而不是该实例的编译时类型(即 A)。

由于一个类中声明的方法可以隐藏继承来的方法,因此同一个类中可以包含若干个具有相同签名的虚拟方法。这不会造成多义性问题,因为除派生程度最大的那个方法外,其他方法都被隐藏起来了。在下面的示例中

using System;
class A
{
   public virtual void F() { Console.WriteLine("A.F"); }
}
class B: A
{
   public override void F() { Console.WriteLine("B.F"); }
}
class C: B
{
   new public virtual void F() { Console.WriteLine("C.F"); }
}
class D: C
{
   public override void F() { Console.WriteLine("D.F"); }
}
class Test
{
   static void Main() {
      D d = new D();
      A a = d;
      B b = d;
      C c = d;
      a.F();
      b.F();
      c.F();
      d.F();
   }
}C 类和 D 类均含有两个具有相同签名的虚拟方法:A 引入的虚拟方法和 C 引入的虚拟方法。但是,由 C 引入的方法隐藏了从 A 继承的方法。因此,D 中的重写声明所重写的是由 C 引入的方法,D 不可能重写由 A 引入的方法。此例产生输出:

B.F
B.F
D.F
D.F请注意,通过访问 D 的实例(借助一个派生程度较小的类型,它的方法没有被隐藏起来),可以调用被隐藏的虚拟方法。


本段来自优快云博客:http://blog.youkuaiyun.com/sofoo/archive/2004/11/03/165691.aspx

手把手教你搭建日本亚马逊CVV钓鱼系统(含自动验证功能) 本文详细介绍了电商平台安全防护的关键实践,重点讲解了如何构建自动化风控系统。内容包括基础架构设计、用户行为分析、交易风险评估模型构建、验证机制实现以及系统部署优化,帮助电商平台有效识别和防范安全威胁,同时提升用户体验。 阅读详情

相关推荐

Windows安装WSL子系统及docker,以及WSL和docker配置、使用及问题解决

在Windows操作系统中,Ubuntu子系统(也称为Windows Subsystem for Linux, WSL)为开发者提供了一个在Windows环境下运行Linux环境的平台。然而,有时用户在按照Ubuntu子系统或者使用WSL时,可能会遇到各种问题,下面总结一下解决方式。想要在Windows上安装Docker(实际上是基于Hyper-V或者WSL2这两项虚拟化技术),需要开启虚拟化功能,所以不管是对于系统还是硬件都有一定的要求。

sym的博客 9789

C#中虚方法(virtual)详解

虚方法如何定义? 虚方法怎么声明? 虚方法的规则是什么? 虚方法如何进行调用? 虚方法的作用是什么? 虚方法有什么好处? 虚方法使用时注意什么?

凭时间赢来的东西,时间肯定会为之作证 15万+

Android双目摄像头(RGB+IR)实时预览与人脸活体检测实战指南

本文详细介绍了Android双目摄像头(RGB+IR)实时预览与人脸活体检测的实战指南。通过双摄同步预览、人脸检测与活体判断等技术实现,提升安全认证的准确性和鲁棒性。文章还提供了开发环境搭建、常见问题解决方案及性能优化建议,帮助开发者快速掌握双目摄像头在Android平台的应用。

vulkan6gpu的博客 700

Window下纯软件实现虚拟屏幕C

基本功能就是,取消鼠标只能在本地屏幕的限制,可以无限制扩展。下面是扩展了一个屏幕在,本屏幕的下方。本屏幕最大只有1920x1080 而,当前位置已经虚拟到了 168:1453,落在了扩展屏上!2. 当鼠标移出本进屏幕时,屏蔽鼠标事件。3. 累计鼠标事件,直到返回本地屏幕。1. 实现鼠标hook。

lei006的专栏 1351

哈工大集合论与图论(下)慕课MOOC答案

答案选自2023哈工大集合论与图论慕课,慕课的题重复率很高并且具有极高的相似性,选答案时要格外注意对比选项,能力有限答案不一定面面俱到,整理不易读者且用且珍惜。

qq_34168477的博客 2904

VHDL按键消抖(状态机版本)

检测下降沿:设置一个和,分别代表之前的之前和之前的信号状态,若两个信号key_in_d2=1,key_in_d1=0,他俩的not key_in_d2 and key_in_d1为1,则说明下降沿产生,把它设置为标志位key_flag。延时计数:50MHz的板子每次计数需要20ns,而抖动时间大约为5-10ms。所以取7ms,作为延时时间。可以看见当检测到下降沿时,开始计数计数计满再次检测,若为低电平则为按下按键,否则为抖动。通过检测下降沿来临,延时计数再次检测,如果为低电平则为按键按下。

qq_69639216的博客 1084

C#虚拟与抽象方法详解

本文详细讲解了C#中virtual(虚拟)和abstract(抽象)的区别与用法。虚拟方法使用virtual关键字修饰,允许子类选择性重写,必须包含方法体;而抽象方法使用abstract关键字修饰,没有方法体,强制子类必须重写。文章通过代码示例展示了虚拟方法和抽象方法的定义方式、子类重写规则及调用方式,并总结了11点主要区别,包括关键字不同、实现要求不同、实例化限制等。虚拟方法提供可选重写,抽象方法则强制重写,这是两者最核心的差异。

莫踌躇 7582

UVM实战 卷I学习笔记1——简单的UVM验证平台:只有driver

目录验证平台的组成最简单的验证平台——只有driverUVM如何搭建driver:加入factory机制加入objection机制加入virtual interface 个人《UVM实战卷I》学习随手笔记,此书作者:张强 验证平台的组成 一个验证平台要实现的基本功能: 模拟DUT的各种真实使用情况——给DUT施加各种激励→driver实现激励功能; 根据DUT的输出判断DUT行为是否与预期符合→scoreboard(也称为checker)——需注意判断的东西和判断的标准是什么; 收集DUT的输出并传递

weixin_41979380的博客 3891

【C#基础概念】虚方法virtual

抽象方法是隐式的虚拟方法,所有抽象类的非抽象子类可以用new 和override关键来重写abstract 方法。

weixin_53444764的博客 2328

【芯片设计- 芯片生产及测试 11.2 -- memory repair 详细介绍】

SoC (System on Chip) 的 Memory Repair 是一种技术,用于检测和修复内存中的损坏单元。由于SoC内部集成了大量的逻辑和存储单元,包括RAM(随机访问存储器)、ROM(只读存储器)、缓存等,在制造过程中,由于工艺偏差或材料缺陷,有可能产生一些损坏的内存位。Memory Repair 机制允许系统检测这些错误并采取措施纠正,以提高芯片的产量和可靠性。

CodingCos的博客 3227

【大模型+知识图谱】哈工大版chinese-roberta-wwm-ext模型介绍、下载部署和GPU显卡配置

RoBERTa模型的一个重要改进版本,由阿里云的研究团队提出。而Chinese RoBERTa-wwm-ext则是针对中文文本的预训练模型,它在哈工大的研究团队手中进一步优化,特别适用于中文自然语言处理任务。

知识靠谱的博客 2775

C# 虚方法

虚方法的作用是实现多态性,即同一个方法可以在不同的对象上产生不同的行为。这样可以使程序更加灵活,可以根据需要在运行时动态地确定调用哪个方法。虚方法也可以用于实现基类和派生类之间的协作,派生类可以在不破坏基类的情况下扩展基类的功能。在C#中,虚方法是一种允许子类重写的方法。

qq_45308912的博客 1001

如何理解S参数的三大特性

提到S参数的时候经常会涉及一些概念,如无源性、因果性、互易性等,本文逐一介绍这些特性的概念、成因以及判断方式。

一只豌豆象的博客 4501

C#中虚方法和抽象方法的区别

定义抽象方法是使用abstract关键字修饰的方法,在基类中没有具体的实现。抽象方法必须在派生类中实现。实现抽象方法在基类中没有实现体,只有方法签名。派生类必须实现基类中的每一个抽象方法,否则派生类也必须声明为抽象类。实例化含有抽象方法的类本身不能被实例化,必须是抽象类。只有派生类实现了所有抽象方法后,派生类才可以被实例化。调用抽象方法没有自己的实现,它们必须在派生类中实现,所以调用是通过派生类的实例来实现的。// 错误:不能实例化抽象类。

Major_S的博客 814

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C#中虚方法与抽象方法的区别

前言:在前面的博文中,我介绍了C#中的虚方法与抽象方法,本博文将对两者的区别进行详细叙述。参考博文:浅谈C#中虚方法与隐藏方法的区别、深究C#中的抽象类、抽象属性、抽象方法 文章目录一、虚方法的回顾二、抽象方法的回顾三、虚方法与抽象方法的区别四、对于两者区别的总结 一、虚方法的回顾 虚方法必须使用virtual修饰。 虚方法同抽象方法(adstract)一样使用override关键字重写。 虚方法在子类中可以实现,也可以不实现。 虚方法必须有方法体哪怕是空的。 虚方法不能使用sealed修饰,否则不能重写

路虽远,行则必至! 1852

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C# 虚方法和抽象方法

虚方法 关键字:virtual 添加关键字virtual之后,会把方法定义为虚方法,

Liu_ChangC的博客 975

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C# 中抽象方法与虚方法的区别

C# 中抽象方法与虚方法的区别 一、抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People //声明一个抽象类 { public abstract void study(); //抽象方法只能定义在抽象类中。 } public class Student:People ...

qq_34761901的博客 401

【C#基础】虚方法和抽象方法

学过C#的人,应该都听过说虚方法和抽象方法,但是对于初学者来说,虚方法和抽象方法,还可能会时常搞混他们的关系。因此我们非常有必要抽出时间,把他们放在一起,进行对比,揭开他们神秘的外纱。         虚方法和抽象方法都可以供派生类重写,那么他们之间有什么区别呢?         虚方法必须有实现部分,而抽象方法必须没有实现部分。          public Class Animal//

柠檬树 983

c#虚方法和抽象方法的使用

虚方法 虚方法存在于相对于需要实现多态的子类的父类当中,同时也是实现多态的最基本的方法。 具体语法:父类的方法,用virtual修饰,表示虚方法。继承它的子类,在内部用override进行重写。 下面进行案例分析: 猫和狗都是动物,他们都会叫,但是叫声不一样。提取出相同的部分,即叫声,将叫声实现为多态。 新建父类:Animal,新建子类Cat、Dog,代码如下: namespace ConsoleApplication1 { class Program { st

每天学习一点点 1228

java虚方法和抽象方法_C#中的虚方法和抽象方法的运用

今天在云和学院学了很多,我这次只能先总结一下C#中的虚方法和抽象的运用。理论:虚方法:用virtual修饰的方法叫做虚方法虚方法可以在子类中通过override关键字来重写常见的虚方法:ToString() Equals抽象方法:抽象类与抽象方法由abstract修饰abstract的使用注意–抽象方法没有方法体–抽象成员只能存在于抽象类中–抽象类可以有非抽象成员–抽象类的派生类必须实现抽象方法体...

weixin_32515143的博客 220

C#之抽象方法和虚方法

待更

周文慧--廊坊师范学院提高班15期 692

C#中,虚方法(virtual) 和 抽象方法(abstract)的应用说明

一.虚方法(virtual) 和 抽象方法(abstract)的相关定义说明 二.虚方法(virtual) 和 抽象方法(abstract)的示例 三.虚方法(virtual) 和 抽象方法(abstract)区别与联系 四.虚方法(virtual) 和 抽象方法(abstract)注意事项 五.总结

weixin_53520014的博客 1407

c#抽象方法和虚方法的作用

在C#中,抽象方法和虚方法都是面向对象编程中非常重要的概念,它们主要用于实现多态性(Polymorphism)和接口的实现。:通过在抽象类中声明抽象方法,子类必须实现这些方法,除非子类也是抽象类。隐藏而非重写:如果子类中没有使用override关键字重写虚方法,那么该方法在子类中将被隐藏,而非重写。:如果一个类包含抽象方法,那么这个类必须是抽象的,除非它实现了所有的抽象方法。:允许使用抽象类类型的引用变量来调用在子类中重写的方法,从而实现多态性。是在类中声明的但没有具体实现的方法。定义:虚方法是在基类中。

weixin_61819056的博客 301

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

Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚...

春雪阁 1484

C# 虚方法与抽象方法区别

虚方法是必须要实现的,只有接口或者抽象方法才没有实现体,什么是实现体,就是方法的那对大括号:下面举例:public abstract void Fn1();//定义一个抽象方法 publi...

dotNET跨平台 429
上一篇: 你工作几年了?
下一篇: c# new and override区别
-1悟空1-
博客等级 码龄18年 18粉丝 10原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值