C#(C Sharp)学习笔记_多态【十九】
前言
- 个人觉得多态在面向对象编程中还比较重要的,而且不容易理解。
- 也是学了一个下午,才把笔记写得相对比较完善,但仍欠缺一些内容。
- 慢慢来吧……
什么是多态?
基本概念
- 在编程语言和类型论中,多态(Polymorphism)指为不同数据类型的实体提供统一的接口。 多态类型(Polymorphic Type)可以将自身所支持的操作套用到其它类型的值上。
- 多态是面向对象编程(OOP)的一个基本概念,是面向对象的三大特征之一。它允许不同的对象对同一消息做出响应,但具体的行为会根据对象的实际类型而有所不同。在C#中,多态主要通过继承和接口实现。本文将探讨多态的基本概念、实现方式以及在C#中的一些实际应用。
- 多态性可以定义为允许不同类的对象对同一消息做出响应的能力,但具体响应取决于消息接收者的实际类型。简单来说,多态性允许我们编写更通用的代码,可以处理不同类型的对象。
多态的作用
1. 接口实现:多态使得一个接口可以有多种不同的实现方式。子类可以重写父类的方法,以提供特定的实现。
2. 代码复用:通过继承和多态,可以减少代码的重复编写,提高代码的复用性。
3. 灵活性和扩展性:多态允许程序在不修改现有代码的情况下,通过增加新的子类来扩展功能。
4. 解耦:多态减少了代码之间的耦合度。高层模块可以操作抽象类型,而具体的实现可以由子类提供,这使得高层模块不依赖于具体实现。
5. 动态绑定:在运行时,多态允许调用正确的方法版本,这是通过动态绑定或晚期绑定实现的。
6. 简化复杂性:多态简化了处理复杂系统的方式,因为可以使用统一的接口来处理不同类型的对象。
7. 支持开放/封闭原则:多态支持开放/封闭原则,即软件实体应该对扩展开放,对修改封闭。这意味着可以在不改变现有代码的基础上增加新功能。
8. 提高代码的可维护性:由于多态减少了代码间的依赖,因此当需要修改或更新时,可以更容易地进行维护。
9. 支持设计模式:多态是许多设计模式的基础,如工厂模式、策略模式等,这些模式可以进一步增强代码的灵活性和可维护性。
10. 促进面向对象设计:多态是面向对象设计的核心概念之一,它鼓励开发者采用面向对象的方法来思考和解决问题。
在C#中实现多态,通常涉及到接口、抽象类和虚方法的使用。通过这些机制,开发者可以创建灵活且可扩展的应用程序。
多态的实现方法
虚方法重写
- 虚方法(Virtual Methods)和方法重写(Override)是实现多态的两种机制,它们允许子类改变继承自父类的行为。
- 虚方法(Virtual Methods)
- 定义:虚方法是在基类中使用virtual关键字声明的方法,它允许在派生类中被重写。
- 目的:虚方法的目的是为了在派生类中提供特定于派生类的行为。
- 调用:虚方法可以在基类中被调用,也可以在派生类中被调用,调用哪个方法取决于对象的运行时类型。
- 使用场景:当你希望提供一个默认的行为,并且允许派生类根据需要修改这个行为时,使用虚方法。
- 方法重写(Override)
- 定义:方法重写是在派生类中使用override关键字来重写基类中的虚方法。
- 目的:方法重写的目的是为了提供与基类不同的实现,以适应派生类的具体需求。
- 调用:方法重写只能在派生类中调用,用于改变或扩展基类的行为。
- 使用场景:当你需要根据派生类的特性来改变基类方法的行为时,使用方法重写。
注意:虚方法重写不能出现在同一个类中,重写方法必须在派生类中
5. 看实例:C#中的virtual关键字允许我们定义一个可以在派生类中被重写的方法。我们先定义一个Fruit类,在里面用virtual关键字写一个Apple( )方法,看的出来,被virtual修饰符修饰的方法我们称它为虚方法。
public class Fruit
{public virtual void Apple(){Console.Write("我是一个苹果");}
}
- 在写完虚方法后,我们再定义一个继承Fruit类的派生类RedFuJiApple。在里面写一个重写方法Apple( ),什么叫重写呢?说明白点,就是把上面的虚方法重写,重写方法要用override关键字修饰。
public class RedFuJiApple():Fruit
{public override void Apple(){Console.Write("我是一个红富士苹果");}
}
- 最后执行代码,会发现:原本调用RedFuJiApple对象时,输出的应该是父类被继承的Apple方法,但因为我们在派生类中重写了Apple方法,所以最终输出的是:“我是一个红富士苹果"。父类中被重写的虚方法相当于被覆盖掉了。
Fruit Eat = new RedFuJiApple();
Eat.Apple();
函数重载
- 函数重载(Function Overload)是实现多态的方式之一。方法重载发生在同一个类中,它允许一个类中存在多个同名的方法,但它们的实际参数不能相同(包括实参的类型、数量或顺序不同,其中之一不同即可)。
温馨提示:方法和函数本质上是没什么区别的,在面向对象中,它们俩经常被交替称呼,所以方法重载和函数重载其实指的是同一件事情。
public class Overload()
{public void calculation(int addition, int addition_2){Console.WriteLine(addition + addition_2);}public void calculation(int multiplication){Console.WriteLine(multiplication * multiplication);}
}
- 我们可以在一个类中写多个同名方法,前提是实参内容不能相同。
Overload Math = new Overload();
Math.calculation(1, 2);
Math.calculation(2);
- C#编译器在编译时会根据传递给函数的参数类型和数量来确定调用哪个重载的方法。如果存在多个重载的函数,并且编译器无法确定调用哪一个,编译器将会报错。
- 在调用方法时,我们只需要区分开来即可,这就是重载函数的使用,也是实现多态的方式之一。
抽象类与抽象方法
- 抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
- 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
- 抽象类(Abstract)是一种不能被实例化的类,它通常用作其他类的基类。
- 抽象类允许你定义一些通用的行为和属性,这些可以被派生类继承和扩展。
- 抽象类也可以定义抽象方法。 方法是将关键字 abstract 添加到方法的返回类型的前面。
- 实例操作一下:我们定义一个抽象类Drink,并在类里面定义一个抽象方法Coffee,这个抽象方法不允许包含任何内容,其次我们在写一个普通的方法。
public abstract class Drink() // 抽象类
{public abstract void Coffee(); // 抽象方法public void MilkTea(){Console.WriteLine("我是一杯奶茶");}
}
- 再另外定义一个派生类,重写一个Coffee方法。
public class Juice() : Drink
{public override void Coffee(){Console.WriteLine("我是一杯咖啡");}
}
- 在运行时我们会发现,我们无法直接实例化抽象类,也无法直接调用抽象方法,仅能够实例化派生类和调用重写方法。
Drink Eat = new Juice();
//Drink Eat = new Drink(); 不允许实例化抽象类和调用抽象方法
Eat.Coffee();
Eat.MilkTea();
8.抽象类和抽象方法的主要用途是实现代码的复用和多态性,同时为派生类提供一个必须遵循的契约。
相关文章:

C#(C Sharp)学习笔记_多态【十九】
前言 个人觉得多态在面向对象编程中还比较重要的,而且不容易理解。也是学了一个下午,才把笔记写得相对比较完善,但仍欠缺一些内容。慢慢来吧…… 什么是多态? 基本概念 在编程语言和类型论中,多态(Poly…...

电子竞赛1——基于DDS的AM信号发生器
课题要求 产生AM调幅波; 要求:载波10K,被调制波1K; 短按键1(pin_143)改变该调幅波的调制度:25%、50%、75%; 长按按键1(pin_143)改变被调制信号频率&#…...

CentOS7的#!bash #!/bin/bash #!/bin/env bash #!/usr/bin/bash #!/usr/bin/env bash
bash脚本开头可写成 #!/bin/bash , #!/bin/env bash , #!/usr/bin/bash , #!/usr/bin/env bash #!/bin/bash , #!/usr/bin/bash#!/bin/env bash , #!/usr/bin/env bash CentOS7的 /bin 是 /usr/bin 的软链接, /sbin 是 /usr/sbin 的软链接, [root3050 ~]# ll /bin lrwxrwxrw…...
代码随想录第四十一天打卡
01背包问题 二维 代码随想录 视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili #include <iostream> #include <vector>…...
矩阵补全IGMC 学习笔记
目录 Inductive Graph-based Matrix Completion (IGMC) 模型 igmc推理示例: Inductive Graph-based Matrix Completion (IGMC) 模型 原版代码: IGMC/models.py at master muhanzhang/IGMC GitHub GNN推理示例 torch_geometric版本:tor…...

面试题之CSS
1. 引入样式的方式 外部样式 link import 区别 内部样式 /* 写在头部标签 */ <style></style>行内样式 2. 三行代码画三角形 .triangle{width:0px;border:100px solid;border-color:transparent transparent transparent red; }3.属性的继承 可继承的属性 …...

MFC扩展库BCGControlBar Pro v35.0新版亮点:重新设计的工具栏编辑器等
BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了,这个版本改进类Visual Studio 2022的视觉主题、增强对多个…...
python调用SDK的问题
问题:Could not find module MvCameraControl.dll 原因:识别环境变量runtime异常 解决:指定具体绝对地址即可。MvCameraControl.dll的位置C:\Program Files (x86)\Common Files\MVS\Runtime\Win64_x64 MvCamCtrldll WinDLL("MvCamer…...

html入门综合练习
综合练习 通过实际项目练习可以更好地理解和掌握HTML、CSS和JavaScript。以下是几个综合练习项目的建议: 项目1:个人简历网页 创建一个包含以下内容的个人简历网页: 个人简介(姓名、照片、联系方式)教育背景工作经…...
函数模板的具体化
函数模板优点是通用性,可以解决某个方面的普遍性问题,但是这个世界上的事情不是绝对的,有普遍的,就有绝对的。举个栗子: #include <iostream> using namespace std; template <typename T> void Swap(T &…...

【Linux 内存管理】
文章目录 1. 为什么要有虚拟内存呢?🔍 1. 为什么要有虚拟内存呢?🔍...
AJAX 数据库
AJAX 数据库 1. 引言 AJAX(Asynchronous JavaScript and XML)是一种流行的网络开发技术,它允许网页在不重新加载整个页面的情况下与服务器交换数据和更新部分网页内容。AJAX技术与数据库的结合,为现代网络应用提供了更加丰富和动态的用户体验。本文将探讨AJAX如何与数据库…...
力扣719.找出第K小的数对距离
力扣719.找出第K小的数对距离 二分答案 朴素版 双指针遍历数组 超过界限break auto check [&](int mid) -> bool{int res0;for(int i0;i<n-1;i)for(int ji1;j<n;j){if(nums[j] - nums[i] > mid) break;elseif(res > k) return true;}return false;};优…...
富格林:掌握可信出金交易策略
富格林认为,黄金市场是起起落落,似乎机遇无处不在,但很少有人能真正抓住机遇。黄金可以做多也可以做空,做空主要是为了从黄金价格波动的价差中获利。只有采用正规可信的操作技巧,才能实现顺利获利出金,减少…...

HCS-华为云Stack-容器网络
HCS-华为云Stack-容器网络 容器隧道overlay VPC网络...

【CSS in Depth2精译】1.1 层叠
CSS 本质上就是声明规则,并让这些特定的规则在各种情况下生效。一个类添加到某个元素上,则应用这个类包含的这一些样式;元素 X 是元素 Y 的一个子节点,则应用另一些样式。浏览器于是根据这些规则,判定所有样式生效的具…...

【读博日记】拓扑结构(待修正)
Topology 拓扑学 内容来源于互联网,还在甄别中——20240617 拓扑结构指把实体抽象成与其形状大小无关的点,把连接实体的线路抽象成线,再研究这些电线之间的关系。 所谓相似的拓扑结构: 例如一个圆环变成正方形、长方形、三角形…...
QT 中setVisible()和setEnabled()的区别
setVisible(bool)和setEnabled(true)在PyQt(以及其他类似的图形用户界面框架)中分别用于控制控件的可见性和可用性,它们之间的主要区别如下: setVisible(bool) 功能:这个函数用于设置QWidget控件的可见状态。参数&am…...

【YashanDB知识库】PHP使用ODBC使用数据库绑定参数功能异常
【问题分类】驱动使用 【关键字】ODBC、驱动使用、PHP 【问题描述】 PHP使用PDO_ODBC连接yashan数据库,使用绑定参数获取数据时,客户现场出现报错 本地复现未出现异常报错,但是无法正确获取数据。 【问题原因分析】开启ODBC报错日志后&am…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...

高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...