C#(C Sharp)学习笔记_多态【十九】

前言

  1. 个人觉得多态在面向对象编程中还比较重要的,而且不容易理解。
  2. 也是学了一个下午,才把笔记写得相对比较完善,但仍欠缺一些内容。
  3. 慢慢来吧……

什么是多态?

基本概念

  1. 在编程语言和类型论中,多态(Polymorphism)指为不同数据类型的实体提供统一的接口。 多态类型(Polymorphic Type)可以将自身所支持的操作套用到其它类型的值上。
  2. 多态是面向对象编程(OOP)的一个基本概念,是面向对象的三大特征之一。它允许不同的对象对同一消息做出响应,但具体的行为会根据对象的实际类型而有所不同。在C#中,多态主要通过继承和接口实现。本文将探讨多态的基本概念、实现方式以及在C#中的一些实际应用。
  3. 多态性可以定义为允许不同类的对象对同一消息做出响应的能力,但具体响应取决于消息接收者的实际类型。简单来说,多态性允许我们编写更通用的代码,可以处理不同类型的对象。

多态的作用

1. 接口实现:多态使得一个接口可以有多种不同的实现方式。子类可以重写父类的方法,以提供特定的实现。

2. 代码复用:通过继承和多态,可以减少代码的重复编写,提高代码的复用性。

3. 灵活性和扩展性:多态允许程序在不修改现有代码的情况下,通过增加新的子类来扩展功能。

4. 解耦:多态减少了代码之间的耦合度。高层模块可以操作抽象类型,而具体的实现可以由子类提供,这使得高层模块不依赖于具体实现。

5. 动态绑定:在运行时,多态允许调用正确的方法版本,这是通过动态绑定或晚期绑定实现的。

6. 简化复杂性:多态简化了处理复杂系统的方式,因为可以使用统一的接口来处理不同类型的对象。

7. 支持开放/封闭原则:多态支持开放/封闭原则,即软件实体应该对扩展开放,对修改封闭。这意味着可以在不改变现有代码的基础上增加新功能。

8. 提高代码的可维护性:由于多态减少了代码间的依赖,因此当需要修改或更新时,可以更容易地进行维护。

9. 支持设计模式:多态是许多设计模式的基础,如工厂模式、策略模式等,这些模式可以进一步增强代码的灵活性和可维护性。

10. 促进面向对象设计:多态是面向对象设计的核心概念之一,它鼓励开发者采用面向对象的方法来思考和解决问题。

在C#中实现多态,通常涉及到接口、抽象类和虚方法的使用。通过这些机制,开发者可以创建灵活且可扩展的应用程序。

多态的实现方法

虚方法重写

  1. 虚方法(Virtual Methods)和方法重写(Override)是实现多态的两种机制,它们允许子类改变继承自父类的行为。
  2. 虚方法(Virtual Methods)
  • 定义:虚方法是在基类中使用virtual关键字声明的方法,它允许在派生类中被重写。
  • 目的:虚方法的目的是为了在派生类中提供特定于派生类的行为。
  • 调用:虚方法可以在基类中被调用,也可以在派生类中被调用,调用哪个方法取决于对象的运行时类型。
  • 使用场景:当你希望提供一个默认的行为,并且允许派生类根据需要修改这个行为时,使用虚方法。
  1. 方法重写(Override)
  • 定义:方法重写是在派生类中使用override关键字来重写基类中的虚方法。
  • 目的:方法重写的目的是为了提供与基类不同的实现,以适应派生类的具体需求。
  • 调用:方法重写只能在派生类中调用,用于改变或扩展基类的行为。
  • 使用场景:当你需要根据派生类的特性来改变基类方法的行为时,使用方法重写。

在这里插入图片描述

注意:虚方法重写不能出现在同一个类中,重写方法必须在派生类中
5. 看实例:C#中的virtual关键字允许我们定义一个可以在派生类中被重写的方法。我们先定义一个Fruit类,在里面用virtual关键字写一个Apple( )方法,看的出来,被virtual修饰符修饰的方法我们称它为虚方法。

public class Fruit
{public virtual void Apple(){Console.Write("我是一个苹果");}
}
  1. 在写完虚方法后,我们再定义一个继承Fruit类的派生类RedFuJiApple。在里面写一个重写方法Apple( ),什么叫重写呢?说明白点,就是把上面的虚方法重写,重写方法要用override关键字修饰。
public class RedFuJiApple():Fruit
{public override void Apple(){Console.Write("我是一个红富士苹果");}
}
  1. 最后执行代码,会发现:原本调用RedFuJiApple对象时,输出的应该是父类被继承的Apple方法,但因为我们在派生类中重写了Apple方法,所以最终输出的是:“我是一个红富士苹果"。父类中被重写的虚方法相当于被覆盖掉了。
Fruit Eat = new RedFuJiApple();
Eat.Apple();

函数重载

  1. 函数重载(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);}
}
  1. 我们可以在一个类中写多个同名方法,前提是实参内容不能相同。
Overload Math = new Overload();
Math.calculation(1, 2);
Math.calculation(2);
  1. C#编译器在编译时会根据传递给函数的参数类型和数量来确定调用哪个重载的方法。如果存在多个重载的函数,并且编译器无法确定调用哪一个,编译器将会报错。
  2. 在调用方法时,我们只需要区分开来即可,这就是重载函数的使用,也是实现多态的方式之一。

抽象类与抽象方法

  1. 抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
  2. 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
  1. 抽象类(Abstract)是一种不能被实例化的类,它通常用作其他类的基类
  2. 抽象类允许你定义一些通用的行为和属性,这些可以被派生类继承和扩展。
  3. 抽象类也可以定义抽象方法。 方法是将关键字 abstract 添加到方法的返回类型的前面。

在这里插入图片描述

  1. 实例操作一下:我们定义一个抽象类Drink,并在类里面定义一个抽象方法Coffee,这个抽象方法不允许包含任何内容,其次我们在写一个普通的方法。
public abstract class Drink()    // 抽象类
{public abstract void Coffee();   // 抽象方法public void MilkTea(){Console.WriteLine("我是一杯奶茶");}
}
  1. 再另外定义一个派生类,重写一个Coffee方法。
public class Juice() : Drink
{public override void Coffee(){Console.WriteLine("我是一杯咖啡");}
}
  1. 在运行时我们会发现,我们无法直接实例化抽象类,也无法直接调用抽象方法,仅能够实例化派生类和调用重写方法。
 Drink Eat = new Juice();
//Drink Eat = new Drink();  不允许实例化抽象类和调用抽象方法
Eat.Coffee();
Eat.MilkTea();

8.抽象类和抽象方法的主要用途是实现代码的复用和多态性,同时为派生类提供一个必须遵循的契约。

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

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

相关文章

C# + easyui 写的一个web项目

用C# easyui 来开发,其实就是为了开发速度,用easyui可以一天写很多页面,比一些低代码平台还快。 登陆页面 主界面 记录数统计 家庭信息采集表 新建家庭 家庭成员 低保、五保人员帮扶情况登记表 低保、五保人员帮扶情况登记表的新增和编辑 治…

【UE数字孪生学习笔记】 Gameplay框架之TSubclassOf

声明:部分内容来自于b站,知乎,慕课,公开课等的课件,仅供学习使用。如有问题,请联系删除。 部分内容来自UE官方文档,博客等 TSubclassOf TSubclassOf 是一个模板类,用于存储对某个特…

科研辅助工具

科研工具收集 1. 如何筛选出最合适的SCI论文投稿杂志:点击直达 2. 分享三种正确查找期刊全称、缩写的网站: 点击直达

(done) AFL 都有哪些阶段? Stage progress

参考资料:https://afl-1.readthedocs.io/en/latest/user_guide.html 所有阶段如下,包括详细的解释

论文《Dual-Contrastive for Federated Social Recommendation》阅读

论文《Dual-Contrastive for Federated Social Recommendation》阅读 论文概况MotivationMethodologyClient Local ComputingCenter Server Aggregation 总结 今天简单总结一下一篇关于联邦推荐方面的论文《Dual-Contrastive for Federated Social Recommendation》&#xff0c…

Java | Leetcode Java题解之第162题寻找峰值

题目&#xff1a; 题解&#xff1a; class Solution {public int findPeakElement(int[] nums) {int n nums.length;int left 0, right n - 1, ans -1;while (left < right) {int mid (left right) / 2;if (compare(nums, mid - 1, mid) < 0 && compare(n…

【Linux 内存管理】

文章目录 1. 为什么要有虚拟内存呢&#xff1f;&#x1f50d; 1. 为什么要有虚拟内存呢&#xff1f;&#x1f50d;

如何实现element表格合并行?

前两天我一个朋友咨询我element表格合并行的问题,他研究了很久,已经开始怀疑是不是element UI出现了bug,然后跟我一阵沟通,最终解决了问题,他的问题在于他把事情想复杂了,接下来我们一起来看一下这个经典“案例”,很多人真的很有可能走入这个误区,当然老鸟就不用看了,…

读AI新生:破解人机共存密码笔记04计算的极限

1. 计算的极限 1.1. 光靠速度是无法给我们带来人工智能的 1.1.1. 在速度更快的计算机上运行糟糕的算法并不会使算法变得更优秀&#xff0c;这只意味着你会更快地得到错误的答案 1.1.2. 数据越多&#xff0c;错误答案出现的机会就越大 1.…

pytorch基础【3】torch运算

文章目录 torch运算基本运算形状操作自动调整size (参数-1) 数学运算逻辑运算常见的高级操作随机数生成 torch运算 基本运算 创建张量: import torch# 直接从列表或数组创建张量 x torch.tensor([1, 2, 3])创建特定值的张量: # 全零张量 zeros torch.zeros(3, 3)# 全一张量 …

python调用SDK的问题

问题&#xff1a;Could not find module MvCameraControl.dll 原因&#xff1a;识别环境变量runtime异常 解决&#xff1a;指定具体绝对地址即可。MvCameraControl.dll的位置C:\Program Files (x86)\Common Files\MVS\Runtime\Win64_x64 MvCamCtrldll WinDLL("MvCamer…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 石碑文字组合(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Rust语言-线程间的消息传递mpsc::Sender

文章目录 Rust语言-线程间的消息传递mpsc::Sender标准库std::sync::mpsc消息通道mpsc::Sender实战举例 Rust语言-线程间的消息传递mpsc::Sender 标准库std::sync::mpsc 官方文档&#xff1a;https://rustwiki.org/zh-CN/std/sync/mpsc/index.html 参考URL: https://course.rs…

[C++][数据结构][哈希表]详细讲解

目录 1.哈希概念2.哈希冲突3.哈希函数4.哈希冲突解决5.闭散列1.何时扩容&#xff1f;如何扩容&#xff1f;2.线性探测3.二次探测 6.开散列(哈希桶)1.概念2.开散列增容3.开散列思考只能存储key为整形的元素&#xff0c;其他类型怎么解决&#xff1f;除留余数法&#xff0c;最好模…

一季度直播6000场,同比增长60%,遥望科技透露重要信息

6月17日&#xff0c;经由深圳证券交易所许可&#xff0c;遥望科技&#xff08;股票代码&#xff1a;002291&#xff09;正式对《年报问询函》进行公开回复&#xff0c;就经营的多个维度做出解释和回应。 在回复中&#xff0c;遥望科技预测2024年毛利率为14.4%&#xff0c;相比…

[absl_py][python]absl_py所有whl文件下载地址汇总

absl_py是Google开发并维护的一个Python软件包&#xff0c;它是C Abseil库的Python版本。该库旨在提供一系列高质量的、跨平台的实用工具&#xff0c;帮助开发者构建大规模软件项目。以下是关于absl_py的详细介绍&#xff1a; 功能概述&#xff1a; 字符串处理&#xff1a;abs…

conda在不同服务器上迁移环境的方法

conda在不同服务器上迁移环境的方法 conda迁移环境&#xff08;若服务器cuda配置相同&#xff09;我的迁移方法&#xff1a;可能要用到的压缩命令和解压命令&#xff1a; 若服务器cuda版本等配置不同 conda迁移环境&#xff08;若服务器cuda配置相同&#xff09; 我的迁移方法…

【CSS in Depth2精译】1.1.1 样式表来源

您添加到网页的样式表并非浏览器呈现样式的唯一来源。样式表有三种不同的类型或来源。您添加到页面的样式称为 作者样式&#xff08;author styles&#xff09;&#xff1b;此外还有 用户样式&#xff08;user styles&#xff09;&#xff0c;即终端用户设置的自定义样式&#…

configure: error: library ‘crypto‘ is required for OpenSSL

1、执行命令&#xff1a;./configure --prefix/opt/app/postgresql --with-openssl 报错&#xff1a; 2、解决办法 执行命令&#xff1a;yum install openssl-devel 重新执行 ./configure --prefix/opt/app/postgresql --with-openssl

Ubuntu服务器的GitLab部署

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…