C#中修饰符——abstract、virtual

一、多态简介

        在面向对象编程的过程中,多态体现出来的是【一个接口,多个功能】;多态性体现在2个方面:

        1、程序运行时,在方法参数、集合或数组等位置,派生类对象可以作为基类的对象处理;这样该对象声明的类型就与运行时的类型不同了;

        2、基类可以定义并实现虚方法,派生类可以重写这些虚方法;在程序运行时,可以调用基类方法执行派生类的重写方法。

        在C#中要实现多态,必须使用abstract、virtual这个两个修饰符来定义,使用override来重写方法。 多态又可以分为:【静态多态性】、【动态多态性】;

二、静态多态性

         静态多态性(即:使用static修饰;变量、函数的响应是在程序编译时就发生了)若一个方法被static声明,则该方法就是静态方法,那么编译器就会在编译时保留这个静态方法的实现;也就是说这个静态方法只属于类,而不属于任何实例,无论实例是否存在,都可以可直接调用这个静态方法。

        C#中的静态多态性分为两种:【函数重载】、【运算符重载】

    //静态函数重载示例public class StaticReload{public static void Greet(){Console.WriteLine($"你好,欢迎访问");}public static void Greet(string greetMsg){Console.WriteLine(greetMsg);}}//Class_endclass Program{static async Task Main(string[] args){StaticReload.Greet();StaticReload.Greet("Quartz定时任务测试");}}

 

运算符重载 - 定义一元运算符、算术运算符、相等运算符和比较运算符。 - C# reference | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/operator-overloading

三、动态多态性

        动态多态性(无static修饰;变量、函数的响应是在程序运行起来后发生的)。

 3.1、abstract(抽象)

abstract 关键字 - C# reference | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/abstract        【abstract】关键字可用于修饰类(Class)、方法(Method)、属性(attribute)、索引(index)和事件(Event);

  3.1.1、抽象类

         在类(class)前面放置修饰符【abstract】,则可以将类声明为抽象类;

抽象类的特点
序号抽象类特点
1抽象类不能实例化
2抽象类可能包含抽象方法和访问器
3

无法使用 sealed 修饰符来修改抽象类

因为两个修饰符的含义相反【 sealed 修饰符阻止类被继承;而 abstract 修饰符要求类被继承】

4派生自抽象类的非抽象类,必须实际实现所继承抽象类的全部抽象内容(抽象方法、属性、索引、事件)
    public abstract class MyShape{public abstract float GetArea();public abstract string Name { get;}public abstract Action<float> GetAction();}//Class_endpublic class Circle : MyShape{private int _radius;public Circle(int r){_radius = r;}public override string Name {get => "我是圆";}public override Action<float> GetAction(){throw new NotImplementedException();}public override float GetArea(){var tmp =Math.PI * (_radius * _radius);float result =(float)tmp;return result;}}//Class_endclass Program{static async Task Main(string[] args){MyShape myShape = new Circle(3);float shapeArea = myShape.GetArea();Console.WriteLine($"Name:{myShape.Name}  ShapeArea: {shapeArea}");}}

 

抽象类、密封类及类成员 - C# | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members 

  3.1.2、抽象方法

   在方法、属性、索引、事件前面放置修饰符【abstract,则可以声明为抽象方法、属性、索引、事件;且表明方法、属性、索引、事件不包含实现。

抽象方的法特点
序号抽象方法特点
1只有抽象类中才允许声明抽象方法
2

抽象方法不提供实际实现,所以声明仅以分号结尾,没有大括号{};具体实现由一般类继承抽象类使用 override重写

public abstract float GetArea();
3抽象方法声明中使用 static 或 virtual 修饰符是错误的

  3.1.3、abstract的使用场景

        内容有通用的共性特征和行为,且必须要在不同的派生类实现(即:内容必须存在的时候用abstract)。

 3.2、virtual(虚拟)

virtual 关键字 - C# reference | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/virtual  【virtual 】关键字用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。

  3.2.1、虚方法

    public class MyCar{public virtual string Name { get; set; }public virtual string Manufacturer { get; }public MyCar(string manufacturer){this.Manufacturer = manufacturer;}public virtual void Function(){Console.WriteLine($"【{Manufacturer}】品牌车况运行状态良好");}public virtual Action<bool> Custom(bool start){if (start){Console.WriteLine($"【{Name}】仪表盘显示发动机转速");}return null;}}//Classpublic class SUVCar : MyCar{public SUVCar(string manufacturer) : base(manufacturer){}public override void Function(){base.Function();Console.WriteLine($"【{Manufacturer}】品牌开始校验SUV的各个功能是否正常");}public override Action<bool> Custom(bool start){Action<bool> action=new Action<bool>(Test);Console.WriteLine($"【{Name}】所有功能准备完毕,开始出发");return action;}private void Test(bool start){if (start){Console.WriteLine("启动智能驾驶功能");}}}//Class_endclass Program{static async Task Main(string[] args){MyCar car = new MyCar("自产");car.Name = "基础车";car.Function();car.Custom(true);Console.WriteLine("---------------------------\r\n");car = new SUVCar("问界");car.Name = "SUV越野";car.Function();car.Custom(true);}}

虚方法的特点
序号虚方法特点
1虚方法必须有实现
2虚方法可以不在派生类中重写
虚方法的2中使用情况
1基类定义了virtual方法,但是派生类没有重写基类virtual方法,则对派生类的实例调用中,使用的是基类定义的virtual方法内容
2基类定义了virtual方法,且派生类重写了基类的virtual方法,则对派生类的实例调用中,使用的是派生类重写的virtual方法内容

  3.2.2、virual的使用场景

        virtual的核心是多态【即:同一个方法能用不同的方式来做】;如:

1、支付方法Pay(),既可使用微信支付、也可使用支付宝支付或者其他方法支付;

2、消息发送方法MSGSend(),既可使用邮件发送、也可使用企业微信发送、或钉钉发送;

3.3、抽象方法与虚方法的区别与联系

抽象方法与虚方法的相同点是:都使用override重写。

抽象方法与虚方法的区别
序号抽象方法(abstract)虚方法(virtual)
1抽象方法必须在抽象类中没有要求
2抽象方法只是声明没有实际实现,必须在派生类中重写实现虚方法有声明与实际实现,派生类可完全重写、部分重写或不重写直接使用基类实现
3抽象类不能被实例化(new),只能用实现了全部抽象方法的派生类来实例化包含虚方法的类可以被实例化(new)

 3.4、普通类、接口与抽象类

抽象类主要用于关系密切的对象接口适合为不相关的类提供通用功能

普通类、接口、抽象类区别与联系
序号普通类接口抽象类
1普通类可有成员变量、常量、构造函数,没有抽象方法接口不能有常量、域、操作符、构造函数、析构函数及其任何静态成员【可包含属性、方法、索引和事件】抽象类有抽象方法
2普通类可继承一个基类,多个接口接口可继承多个接口抽象类也可继承一个基类和多个接口
3普通类可以定义具体的方法和实际实现接口只能定义方法,而没有具体实现抽象类的抽象方法不能有具体实现
4普通类成员没有限制接口成员必须是公共的抽象类不能对private抽象
5普通类可以实例化接口不能实例化抽象类不能实例化,只能使用实现了全部抽象方法的派生类来实例化

四、其他资料

访问修饰符 - C# reference | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/access-modifiers

面向对象编程 - 封装 - C# | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/object-oriented/#encapsulation面向对象编程 - 继承 - C# | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/object-oriented/inheritance面向对象编程 - 多态性 - C# | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/object-oriented/polymorphismC#面向对象的三大特性(封装、继承、多态)_c# 三大特性-CSDN博客文章浏览阅读3.2k次,点赞3次,收藏43次。一、封装 把客观的事物封装成类,并将类的内部实现隐藏,以保证数据的完整性;每个对象都包含了他能进行操作所需要的所有信息,因此对象不必依靠其他的对象来完成自己的操作。【优点】 1. 将变化隔离; 2. 便于使用; 3. 提高复用性; 4. 提高安全性;【封装原则】 1. 将不需要对外提供的内容都隐藏起来; 2...._c# 三大特性 https://blog.csdn.net/xiaochenXIHUA/article/details/95037977

C#中抽象类和接口的区别与应用场景 https://www.cnblogs.com/yangzhou/p/3283994.html 搞了这么多年终于知道接口和抽象类的应用场景了https://cloud.tencent.com/developer/article/1677833

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot + Spring Integration整合MQTT打造双向通信客户端

1. 概述 本文分两个章节讲解MQTT相关的知识&#xff0c;第一部份主要讲解MQTT的原理和相关配置&#xff0c;第二个章节主要讲和Spring boot的integration相结合代码的具体实现&#xff0c;如果想快速实现功能&#xff0c;可直接跳过第一章节查看第二章讲。 1.1 MQTT搭建 为了…

2025前端面试题记录

vue项目目录的执行顺序是怎么样的&#xff1f; 1、package.json   在执行npm run dev时&#xff0c;会在当前目录寻找package.json文件&#xff0c;此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js   对…

专题|Python贝叶斯网络BN动态推理因果建模:MLE/Bayes、有向无环图DAG可视化分析呼吸疾病、汽车效能数据2实例合集

原文链接&#xff1a;https://tecdat.cn/?p41199 作为数据科学家&#xff0c;我们始终在探索能够有效处理复杂系统不确定性的建模工具。本专题合集系统性地解构了贝叶斯网络&#xff08;BN&#xff09;这一概率图模型在当代数据分析中的创新应用&#xff0c;通过开源工具bnlea…

WX小程序

下载 package com.sky.utils;import com.alibaba.fastjson.JSONObject; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.Cl…

Vulnhub-wordpress通关攻略

姿势一、后台修改模板拿WebShell 第一步&#xff1a;进⼊Vulhub靶场并执⾏以下命令开启靶场&#xff1b;在浏览器中访问并安装好.... 第二步&#xff1a;找到外观--编辑--404.php&#xff0c;将原内容删除并修改为一句话木马&#xff0c;点击更新--File edited successfully. &…

Spring Boot(十六):拦截器Interceptor

拦截器的简介 拦截器&#xff08;Interceptor&#xff09;​是Spring框架中的概​念&#xff0c;它同样适​用于Spring Boot&#xff0c;​因为Spring Boot是基于Spring框架的。拦截器是​一种AOP&#xff08;面向切面编程&#xff09;​的轻量级实现方式&#xff0c;它允许我…

Kotlin v2.1.20 发布,标准库又有哪些变化?

大家吼哇&#xff01;就在三小时前&#xff0c;Kotlin v2.1.20 发布了&#xff0c;更新的内容也已经在官网上更新&#xff1a;What’s new in Kotlin 2.1.20 。 我粗略地看了一下&#xff0c;下面为大家选出一些我比较感兴趣、且你可能也会感兴趣的内容。 注意&#xff01;这里…

开源链动2+1模式、AI智能名片与S2B2C商城小程序源码在社交电商渠道拓宽中的协同应用研究

摘要&#xff1a;本文基于"开源链动21模式""AI智能名片""S2B2C商城小程序源码"三大技术要素&#xff0c;探讨社交电商时代商家渠道拓宽的创新路径。通过解析各技术的核心机制与应用场景&#xff0c;结合京东便利店等实际案例&#xff0c;论证其对…

【蓝桥杯速成】| 10.回溯切割

前面两篇内容我们都是在做有关回溯问题的组合应用 今天的题目主题是&#xff1a;回溯法在切割问题的应用 题目一&#xff1a;分割回文串 问题描述 131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s&#xff0c;请你将 s 分割成一些 子串&#xff…

【嵌入式硬件】三款DCDC调试笔记

关于开关电源芯片&#xff0c;重点关注输入电源范围、输出电流、最低压降。 1.MP9943: 以MP9943为例&#xff0c;输入电压范围4-36V&#xff0c;输出最大电流3A&#xff0c;最低压降为0.3V 调整FB使正常输出为5.06V 给定6V空载、5V空载、5V带2A负载的情况&#xff1a; 6V带2A…

2025年03月18日柯莱特(外包宁德)一面前端面试

目录 自我介绍你怎么从0到1搭建项目的webpack 的构建流程手写webpack插件你有什么想问我的吗 2. 你怎么从 0 到 1 搭建项目的 在面试中回答从 0 到 1 搭建前端项目&#xff0c;可按以下详细步骤阐述&#xff1a; 1. 项目前期准备 需求理解与分析 和产品经理、客户等相关人…

在vitepress中使用vue组建,然后引入到markdown

在 VitePress 中&#xff0c;每个 Markdown 文件都被编译成 HTML&#xff0c;而且将其作为 Vue 单文件组件处理。这意味着可以在 Markdown 中使用任何 Vue 功能&#xff0c;包括动态模板、使用 Vue 组件或通过添加 <script> 标签为页面的 Vue 组件添加逻辑。 值得注意的…

Jupyter Notebook 常用命令(自用)

最近有点忘记了一些常见命令&#xff0c;这里就记录一下&#xff0c;懒得找了。 文章目录 一、文件操作命令1. %cd 工作目录2. %pwd 显示路径3. !ls 列出文件4. !cp 复制文件5. !mv 移动或重命名6. !rm 删除 二、代码调试1. %time 时间2. %timeit 平均时长3. %debug 调试4. %ru…

Java面试黄金宝典12

1. 什么是 Java 类加载机制 定义 Java 类加载机制是 Java 程序运行时的关键环节&#xff0c;其作用是把类的字节码文件&#xff08;.class 文件&#xff09;加载到 Java 虚拟机&#xff08;JVM&#xff09;中&#xff0c;并且将字节码文件转化为 JVM 能够识别的类对象。整个类…

第十四章:模板实例化_《C++ Templates》notes

模板实例化 核心知识点解析多选题设计题关键点总结 核心知识点解析 两阶段查找&#xff08;Two-Phase Lookup&#xff09; 原理&#xff1a; 模板在编译时分两个阶段处理&#xff1a; 第一阶段&#xff08;定义时&#xff09;&#xff1a;检查模板语法和非依赖名称&#xff0…

LSM-Tree(Log-Structured Merge-Tree)详解

1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一种 针对写优化的存储结构,广泛用于 NoSQL 数据库(如 LevelDB、RocksDB、HBase、Cassandra)等系统。 它的核心思想是: 写入时只追加写(Append-Only),将数据先写入内存缓冲区(MemTable)。内存数据满后…

LangChain组件Tools/Toolkits详解(6)——特殊类型注解Annotations

LangChain组件Tools/Toolkits详解(6)——特殊类型注解Annotations 本篇摘要14. LangChain组件Tools/Toolkits详解14.6 特殊类型注解Annotations14.6.1 特殊类型注解分类14.6.1 InjectedToolArg构建运行时绑定值工具14.6.3 查看并传入参数14.6.4 在运行时注入参数14.6.5 其它特…

openharmony中hilog实证记录说明(3.1和5.0版本)

每次用这个工具hilog都有一些小用法记不清&#xff0c;需要花一些时间去查去分析使用方法&#xff0c;为了给丰富多彩的生活留出更多的时间&#xff0c;所以汇总整理共享来了&#xff0c;它来了它来了~~~~~~~~~ 开始是想通过3.1来汇总的&#xff0c;但实际测试发现openharmony…

NVIDIA nvmath-python:高性能数学库的Python接口

NVIDIA nvmath-python&#xff1a;高性能数学库的Python接口 NVIDIA nvmath-python是一个高性能数学库的Python绑定&#xff0c;它为Python开发者提供了访问NVIDIA优化数学算法的能力。这个库特别适合需要高性能计算的科学计算、机器学习和数据分析应用。 文章目录 NVIDIA nv…

【euclid】20 2D包围盒模块(box2d.rs)

box2d.rs文件定义了一个二维轴对齐矩形&#xff08;Box2D&#xff09;&#xff0c;使用最小和最大坐标来表示。矩形在坐标类型&#xff08;T&#xff09;和单位&#xff08;U&#xff09;上是泛型的。代码提供了多种方法来操作和查询矩形&#xff0c;包括求交集、并集、平移、缩…