前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C#进阶学习--虚方法(virtual)

C#进阶学习--虚方法(virtual)

原创
作者头像
腾云大使
发布于 2022-01-11 12:36:48
发布于 2022-01-11 12:36:48
8500
举报

一.定义

简单的说,虚方法就是可以被子类重写的方法,如果子类重写了虚方法,那么运行时将使用重写后的逻辑,如果没有重写,则使用父类中虚方法的逻辑。
定义关键字:virtual
重写关键字:override

二.实例

定义一个Person类与Person类的Student子类,如下:

代码语言:C#
AI代码解释
复制
 public class Person
    {
        public string  Name { get; set; }

        public virtual int Age { get; set; }

        public virtual void SayHello()
        {
            Console.WriteLine("大家好,我是"+this.Name+" 年龄"+this.Age);
        }
        public virtual int Add(int a)
        {
            return this.Age+a;
        }
    }
假设现在学生类有如下需求:
1.需要在SayHello方法中增加学号的返回
2.需要对年龄做出校验,当年龄大于18岁时,直接返回18
代码语言:C#
AI代码解释
复制
  public class Student:Person
    {
        public string StuNO { get; set; }

        public override int Age
        {
            get => base.Age;            
            set => base.Age = value>18?18:value;
        }
        public override void SayHello()
        {
            Console.WriteLine("大家好,我是" + this.Name+",年龄"+this.Age+",我的学号是"+this.StuNO);
        }

    }

我们看到,针对需求1和2,重写了Age属性与SayHello方法,在控制台调用SayHello方法,调用方法如下:

代码语言:C#
AI代码解释
复制
 Person person = new Person();
 person.Name = "人";
 person.Age = 25;
 person.SayHello(); 

 Student student = new Student();
 student.Name = "学生";
 student.Age = 25;//这里的年龄大于18
 student.StuNO = "001";
 student.SayHello();

结果如下图:

这个时候,我们在Student类中增加一个Add方法(不是重写),然后再重写父类中的Add方法,如下:

代码语言:C#
AI代码解释
复制
  public int Add(int a,int b) //这个是新方法,表明覆盖父类里的同名类,而不是重新实现
        {
            return this.Age + a + 10;
        }

        public override int Add(int a)  //这个是重写的父类中的Add方法
        {
            return base.Add(a)+666;
        }

这时,在控制台调用Add方法时,如果采用两个参数,则执行新方法,如果采用一个参数,则执行重写方法。

如果采用子类实例化父类的方式,如下:

代码语言:C#
AI代码解释
复制
Person aaa = new Student();
aaa.SayHello();

通过验证,我们会发现,这时的SayHello执行的是子类中重写的SayHello方法

关于子类与父类虚方法的实现顺序,在这里直接给出前人的总结:

1、当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数;
2、如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。
3、在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果是有,那么OK,它就不会再找了,而马上执行该实例类中的这个重新实现的函数。而如果没有的话,系统就会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。

至此,虚方法的总结结束......

最后,其实所有的数据测试可以在云服务器进行,大家可以看看腾讯云的相关服务,买来作为测试数据的服务器非常不错

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文轻松搞定ELK日志实时采集分析平台
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。
一行Java
2022/04/07
3.5K0
一文轻松搞定ELK日志实时采集分析平台
ELK 日志分析系统整合 KafKa Zookeeper 集群
kafka/zookeeper 集群配置请参考公众号ELK专栏《KafKa 工作原理 && 集群部署(一)》的文章。
Kevin song
2020/04/27
1.1K0
011.ELK使用Kafka做缓存收集Nginx日志
1. 流程说明 2. 配置过程 2.1 nginx配置 log_format json '{"time_local": "$time_local", '
CoderJed
2020/05/04
6860
基于Kafka+ELK搭建海量日志平台
早在传统的单体应用时代,查看日志大都通过SSH客户端登服务器去看,使用较多的命令就是 less 或者 tail。如果服务部署了好几台,就要分别登录到这几台机器上看,等到了分布式和微服务架构流行时代,一个从APP或H5发起的请求除了需要登陆服务器去排查日志,往往还会经过MQ和RPC调用远程到了别的主机继续处理,开发人员定位问题可能还需要根据TraceID或者业务唯一主键去跟踪服务的链路日志,基于传统SSH方式登陆主机查看日志的方式就像图中排查线路的工人一样困难,线上服务器几十上百之多,出了问题难以快速响应,因此需要高效、实时的日志存储和检索平台,ELK就提供这样一套解决方案。
王知无-import_bigdata
2019/07/29
9.2K0
基于Kafka+ELK搭建海量日志平台
分布式日志处理:ELK+Kafka实现日志收集
不需要朋友之间跳过即可!应用开发 这里一般公司中,都会有专业的运维人员来进行搭建,个人学习就顺手学习了整理了笔记! 适合个人学习搭建
Java_慈祥
2024/08/06
7530
分布式日志处理:ELK+Kafka实现日志收集
005.ELK收集Nginx日志
ab工具用于批量发送HTTP请求到指定的URL,是一个压力测试工具,这里使用它来生成Nginx的日志
CoderJed
2020/04/24
6420
005.ELK收集Nginx日志
06 . ELK Stack + kafka集群
https://www.cnblogs.com/you-men/p/13361910.html
iginkgo18
2020/09/27
4000
海量日志归集与分析:ELK集群搭建
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana,也可以指elk技术栈,包含一系列的组件。
品茗IT
2019/09/12
1.9K0
ELK+kafka+Filebeat
软件包官方下载地址:https://www.elastic.co/cn/downloads/ 2、部署ElasticSearch
@凌晨
2021/01/29
6560
ELK+kafka+Filebeat
ELK+Kafka学习笔记之搭建ELK+Kafka日志收集系统集群
关于如何搭建ELK部分,请参考这篇文章,https://www.cnblogs.com/JetpropelledSnake/p/9893566.html。
Jetpropelledsnake21
2018/12/24
9K0
kubernetes-平台日志收集ELK(十七)
使用ELK Stack收集Kubernetes平台中日志与可视化 K8S系统的组件日志 K8S Cluster里面部署的应用程序日志 日志系统: ELK安装 安装jdk [root@localhost
yuezhimi
2020/09/30
6080
Openstack架构下的日志链路追踪
当我们从上层平台发出一个请求后,由于用户不知道链路之间数据的传递关系,但是又想要快速定位问题出在什么地方,是云管平台,还是openstack,亦或者是操作系统层面,一个结构化的日志数据能够帮助我们快速定位问题。
半月弧
2021/03/18
2.9K1
Openstack架构下的日志链路追踪
Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现
当我们在开源日志分析系统的领域,谈及 ELK 架构可谓是家喻户晓。然而,这个生态系统并非 Elastic 有意为之,毕竟 Elasticsearch 的初衷是作为一个分布式搜索引擎。其广泛应用于日志系统,实则是一种意料之外,这是社区用户的推动所致。如今,众多云服务厂商在推广自己的日志服务时,往往以 ELK 作为参照标准,由此可见,ELK 的影响力之深远。
栗筝i
2023/10/23
1.7K0
Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现
05 . ELK Stack+Redis日志收集平台
filebeat是一个轻量级的日志采集器,由于logstash比较消耗资源,不适合在每台主机上部署logstash
iginkgo18
2020/09/27
1.1K0
05 . ELK Stack+Redis日志收集平台
ELK日志收集
Logstash dpkg安装失败所以使用zip解压,然后进如./bin目录下启动
OvO我是肉排菌呀
2021/03/12
5930
ELK日志收集
kubernetes Filebeat+ELK日志收集监控方案
接收来自filebeat的数据,根据其中的tags进行分类,再添加index进行分类,例如nginx-access-%{+YYYY.MM.dd},在kibana中会根据这个index获取日志。
kubernetes中文社区
2019/06/24
3.2K0
kubernetes  Filebeat+ELK日志收集监控方案
Filebeat5+Kafka+ELK Docker搭建日志系统
纯粹是处于个人爱好,各种技术只要跟 Docker 搭边就倾爱它的 Docker 镜像版本。本文除了filebeat agent是二进制版本直接安装在应用机上,与docker无关,其他都是基于docker 镜像版本的集群安装。
曲水流觞
2019/11/05
9650
Filebeat5+Kafka+ELK Docker搭建日志系统
通过ELK实现Nginx日志字段扩展
在日常访问RGW过程中,一般会在RGW前端架设Nginx,并通过Nginx日志来统计或者分析用户请求,但是默认Nginx日志字段是不含bucket_name的,如何通过ELK组件来实现对Nginx日志字段进行补充,添加上bucket_name字段呢?于是就有了下面的内容。
用户1260683
2018/07/31
9950
通过ELK实现Nginx日志字段扩展
利用ELK分析Nginx日志生产实战(高清多图)
本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名不具生产换环境统计意义),生产环境请根据具体需要统计的域名进行统计。
民工哥
2020/09/16
1.9K0
elk+filebeat+grafana日志收集平台学习笔记
node1:elasticsearch6.4+filebeat node2:kibana6.4+grafana+filebeat node3:logstash+nginx+filebeat+Redis 由于es很消耗内存,所以我只把es单独运行在一个主机上,并设置主分片为1,副本分片为0,每周定时删除上周的索引数据
没有故事的陈师傅
2019/07/27
3.8K0
相关推荐
一文轻松搞定ELK日志实时采集分析平台
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档