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

news2024/11/26 18:26:51

前言

  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.coloradmin.cn/o/1833573.html

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

相关文章

DAY3-力扣刷题

1.罗马数字转整数 13. 罗马数字转整数 - 力扣(LeetCode) 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L …

MySQL常见的命令

MySQL常见的命令 查看数据库(注意添加分号) show databases;进入到某个库 use 库; 例如:进入test use test;显示表格 show tables;直接展示某个库里面的表 show tables from 库; 例如:展示mysql中的表格 show tabl…

无广告、简单、实用的高性能 PDF 处理工具

一、简介 1、无广告、简单、实用的高性能 PDF 处理工具。它安装包大小在 240MB 左右,目前仅支持 Windows 平台。 二、下载 1、文末有下载链接,不明白可以私聊我哈(麻烦咚咚咚,动动小手给个关注收藏小三连,我将继续努力为大家寻找以…

【Linux】进程_8

文章目录 五、进程10. 进程等待阻塞等待和非阻塞等待 11. 进程程序替换 未完待续 五、进程 10. 进程等待 上一篇我们知道了 wait 和 waitpid 函数都有一个 status 参数,这个参数是什么呢?这个参数其实就是进程的返回结果,当子进程结束的时候…

银行数仓项目实战(一)--什么是数据仓库

文章目录 数据仓库特点目的:监管报送监管报送的系统主要有?监管报送报送的数据 OLTP和OLAP 架构 数据仓库 数据仓库是一个面向主题的,集成的,非易失的且随时间变化的数据集合,用来支持管理人员的决策。 数据仓库是一个…

Nuxt快速学习开发 - Nuxt3静态资源Assets

Nuxt 使用两个目录来处理样式表、字体或图像等资产。 public/目录内容按原样在服务器根目录中提供。 assets/目录包含您希望构建工具(Vite 或 webpack)处理的所有资产。 public/目录 public目录用作静态资产的公共服务器,可在您的应用程序定…

CEM美国培安消解罐内管 CEM40位 55ML 微波消解罐

内罐采用高纯实验级进口增强改性处理TFM材料或PFA材料,我厂加工的微波罐能与原厂仪器匹配,而且是盖、体通配,无尺寸误差。精选材质,未添加回料,洁净的加工环境,优化了加工工艺,确保低本底&#…

Java多线程设计模式之不可变对象(Immutable Object)模式

简介 多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁。而锁本身又会带来一些问题和开销。Immutable Object模式使得我们可以在不加锁的情况下,既保证共享变量访问的线程安全,又能避免引入锁可能带…

图书管理系统代码(Java)

1、运行演示 QQ2024528-205028-HD 详细讲解在这篇博客:JavaSE:图书管理系统-CSDN博客 2、所建的包 3、Java代码 3.1 book包 3.1.1 Book类代码 package book;/*** Created with IntelliJ IDEA.* Description:* User: dings* Date: 2024-05-13* Time:…

CentOS 7.9检测硬盘坏区、实物定位(三)

系列文章目录 CentOS 7.9上创建JBOD(一) CentOS 7.9上创建的JBOD阵列恢复(二) 文章目录 系列文章目录前言一、在系统中找到硬盘对应的盘符二、使用命令定位实物1.badblocks检测坏块2.对2T以上的硬盘检测(对本篇非必要…

【Mongodb-01】Mongodb亿级数据性能测试和压测

mongodb数据性能测试 一,mongodb数据性能测试1,mongodb数据库创建和索引设置2,线程池批量方式插入数据3,一千万数据性能测试4,两千万数据性能测试5,五千万数据性能测试6,一亿条数据性能测试7&am…

力扣每日一题 6/17 枚举+双指针

博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 522.最长特殊序列II【中等】 题目: 给定字符串列表 strs &…

.Net OpenCVSharp生成灰度图和二值图

文章目录 前言一、灰度图二、二值图 前言 使用OpenCVSharp生成图片的灰度图和二值图 .Net 8.0版本,依赖OpenCvSharp4和OpenCvSharp4.runtime.win组件。 原图: 提示:以下是本篇文章正文内容,下面案例可供参考 一、灰度图 /// &…

亚马逊跟卖ERP系统,怎样提升新手卖家选品的质量与效率!

今天给新手卖家推荐一款实用ERP系统,相信新手卖家在碰到最难的问题应该就是选品了吧,那我们该如何快速解决我们找品难找品慢的问题呢,现在有一套专门为跟卖打造的一款全功能erp系统,从我们选品上传,到我们采购&#xf…

针对微电网中可时移,柔性,基础负荷的电价响应模型---代码解析

前言: 在上两篇帖子中,讲解了我对于粒子群算法的理解,站在巨人的肩膀上去回望:科研前辈们确实非常牛逼,所以它才成为了非常经典的算法。这篇帖子主要是想分享一下,对于微电网、电力系统的论文中&#xff0c…

JavaScript事件类型和事件处理程序

● 之前我们用过了很多此的点击事件,这次让我们来学习另一种事件类型 mouseenter “mouseenter” 是一个鼠标事件类型,它在鼠标指针进入指定元素时触发。 const h1 document.querySelector(h1); h1.addEventListener(mouseenter, function (e) {aler…

用Python pillow 创建和保存GIF动画

使用pillow库来创建和保存gif GIFs:图形交换格式(gif)是一种位图图像格式,由美国计算机科学家Steve Wilhite于1987年6月15日领导的在线服务提供商CompuServe的一个团队开发。 一个GIF文件通常存储一个图像,但该格式允许在一个文件中存储多个图像。该格…

用Vue3和p5.js打造一个交互式数据可视化仪表盘

本文由ScriptEcho平台提供技术支持 项目地址:传送门 基于 Vue.js 集成 p5.js 实现交互式波形图 应用场景介绍 在数据可视化领域,波形图广泛应用于展示动态变化的数据,如声音信号、心跳曲线等。通过动态绘制波形图,用户可以直观…

25天录用!快到飞起的宝藏SSCI,免版面费,1天见刊!毕业评职即刻拿下

本周投稿推荐 SSCI • 中科院2区,6.0-7.0(录用友好) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好) SCI&EI • 4区生物医学类,0.5-1.0(录用…

关于禁止word的无用插入模式

这是我的word版本号 点击左上角文件选项 找到左侧最下方的选项 点击高级 把这两个叉掉