多态性概念 OOPS

大家好!今天,我们将探讨面向对象编程 (OOP) 中的一个基本概念 - 多态性。具体来说,我们将重点介绍其三种主要形式:方法重载、方法覆盖和方法隐藏。对于任何使用 OOP 语言(例如 C#)的程序员来说,理解这些概念都至关重要。

一. 多态性

多态性源自希腊语,意为“多种形式”,是 OOP 的一项功能,允许将不同类型的对象视为父类型的对象。它包括方法重载、方法覆盖和方法隐藏。

二. 方法重载

方法重载是一种允许类拥有多个具有相同名称但不同参数的方法的功能。它增加了程序的可读性,并且是实现编译时多态性的一种方法。

三. 方法重写

方法重写是一种功能,允许子类提供其父类已提供的方法的特定实现。这是实现运行时多态性的一种方法。在父类中必须使用 virtual 关键字标记该方法,在子类中则使用 override 关键字标记该方法。

四. 方法隐藏

方法隐藏是一种功能,即子类中的方法隐藏父类中的方法。它类似于方法覆盖,但用于您不希望子类继承父类的方法时。这是使用 new 关键字完成的。

五. 比较

六. C#示例

using System;public class HelloWorld
{public static void Main(string[] args){Console.WriteLine("Try Polymorphism in C#");Base b = new Child();  // 创建一个基类引用指向派生类对象b.Print();             // 调用派生类的 Print 方法b.Print("Red");        // 调用基类的 Print(string) 方法b.PrintAdd(1, 2);      // 调用基类的 PrintAdd(int, int) 方法b.PrintAdd(1f, 4f);    // 调用基类的 PrintAdd(float, float) 方法}public class Base{public void PrintAdd(int a, int b){Console.WriteLine("Base:Add {0}", a + b);}public void PrintAdd(float a, float b){Console.WriteLine("Base:Add {0}", a + b);}public virtual void Print(string color){Console.WriteLine("Base:Print {0}", color);}public virtual void Print(){Console.WriteLine("Base:Print");}}public class Child : Base{public new void Print(string color){Console.WriteLine("Child:Print {0}", color);}public override void Print(){Console.WriteLine("Child:Print");}}
}
//输出结果
/*
Try Polymorphism in C#
Child:Print
Base:Print Red
Base:Add 3
Base:Add 5
*/

解释

在您的 Base 类中,您已重载 PrintAdd 方法。该方法的一个版本接受两个整数,另一个版本接受两个浮点数。这是方法重载的一个例子,其中相同的方法名称与不同的参数一起使用。

在 Child 类中,您已重写了无参数的 Print 方法。这是方法重写的示例,其中子类为其父类已提供的方法提供了不同的实现。

此外,在您的 Child 类中,您隐藏了接受字符串参数的 Print 方法。这是方法隐藏的一个例子,其中子类中的方法隐藏了父类中的方法。

当您创建一个 Child 对象但将其声明为 Base 对象 (Base b = new Child()😉,并调用 Print 方法时,它将调用 Child 类的 Print 方法(由于方法覆盖),并且不带参数(由于方法隐藏)和 Base 类的 Print 方法(带有字符串参数)。PrintAdd 方法将始终调用 Base 类的方法,因为这些方法在 Child 类中不会被覆盖或隐藏。

七. 结论

方法重载、覆盖和隐藏是 C# 和面向对象编程中的关键概念。它们增强了代码的可读性、可重用性和灵活性。但是,应谨慎使用它们以避免复杂性和可维护性问题。理解这些概念对于在 C# 中有效编程至关重要。

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

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

相关文章

NET 语言识别,语音控制操作、语音播报

System.Speech. 》》System.Speech.Synthesis; 语音播报 》》System.Speech.Recognition 语音识别 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Speech.Recog…

谓词 lambda bind()

对于许多算法,不想使用默认的运算方式,可以使用它的重载版本,新的参数接收谓词,从而会对序列中的元素调用谓词,元素类型必须能转换为谓词参数的类型 可调用表达式:可以使用()调用运…

【音视频】音频重采样

文章目录 前言音频重采样的基本概念音频重采样的原因1. 设备兼容性2. 文件大小和带宽3. 音质优化4. 标准化和规范5. 多媒体同步6. 降低处理负载重采样的注意事项 总结 前言 音频重采样是指将音频文件的采样率转换成另一种采样率的过程。这在音频处理和传输中是一个常见且重要的…

保研面试高频问题——day1

1.你觉得参加建模类的比赛对你大学生活发挥着怎样的作用? 答:感谢老师的提问,参加建模类比赛对大学生活具有显著的积极影响。它不仅锻炼了我的数学建模和计算机编程技能,还提升了我的团队协作和沟通能力。在解决复杂问题的过程中…

mac二进制安装operator-sdk

0. 前置条件 1. 安装go 安装步骤略。 1. 下载operator-sdk源码包 https://github.com/operator-framework/operator-sdk 1.1 选择适合当前go版本的operator版本,在operator-sdk/go.mod文件中可以查看Operator-sdk使用的go版本。 2. 编译 源码包下载后&#x…

2024.7.20 暑期训练记录(6)

CF 1391D - 505(思维状压dp) 首先简化问题,发现一个矩阵如果要满足条件,那它其中的每一个 2 2 2\times 2 22 的小矩阵都要满足条件,于是很容易发现 4 4 4\times4 44 的矩阵是一定不满足条件的(因为是…

C语言航空售票系统

以下是系统部分页面 以下是部分源码&#xff0c;需要源码的私信 #include<stdio.h> #include<stdlib.h> #include<string.h> #define max_user 100 typedef struct ft {char name[50];//名字char start_place[50];//出发地char end_place[50];//目的地char …

kafka-client如何打印连接日志

在Kafka客户端中打印连接日志&#xff0c;通常涉及配置日志框架来捕获和输出Kafka客户端在建立连接过程中的相关信息。由于Kafka客户端使用SLF4J&#xff08;Simple Logging Facade for Java&#xff09;作为日志门面&#xff0c;实际的日志实现&#xff08;如Log4j2、Logback等…

JAVA 异步编程(线程安全)二

1、线程安全 线程安全是指你的代码所在的进程中有多个线程同时运行&#xff0c;而这些线程可能会同时运行这段代码&#xff0c;如果每次运行的代码结果和单线程运行的结果是一样的&#xff0c;且其他变量的值和预期的也是一样的&#xff0c;那么就是线程安全的。 一个类或者程序…

https和http有哪些区别?

在今天的互联网世界中&#xff0c;我们经常听到关于HTTPS和HTTP的术语。它们都是超文本传输协议&#xff08;HTTP&#xff09;的变种&#xff0c;但它们之间存在着重要的区别。本篇博客将深入探讨HTTPS与HTTP之间的差异以及为什么HTTPS在现代网络中变得如此重要。 目录 1. HT…

多线程初阶(二)- 线程安全问题

目录 1.观察count 原因总结 2.解决方案-synchronized关键字 &#xff08;1&#xff09;synchronized的特性 &#xff08;2&#xff09;如何正确使用 语法格式 3.死锁 &#xff08;1&#xff09;造成死锁的情况 &#xff08;2&#xff09;死锁的四个必要条件 4.Java标准…

[C/C++入门][for]22、输出奇偶数之和

复习一下我们前面如何判断奇数 判断一个整数是奇数还是偶数&#xff0c;最常用的方法是利用模运算&#xff08;%&#xff09;。模运算符返回除法的余数。对于任何整数n&#xff0c;当你用n % 2&#xff08;n模2&#xff09;来计算时&#xff0c;如果结果是0&#xff0c;那么n就…

异常:android.os.NetworkOnMainThreadException 原因分析

1.错误异常&#xff1a;android.os.NetworkOnMainThreadException 2.原因分析&#xff1a;出现这个错误一般是数据请求在主线程中进行的&#xff0c;所以只要把耗时操作放到子线程中&#xff0c;更新UI在主线中操作。 3.解决方案demo&#xff1a; 创建一个独立的线程&#xf…

若依二次开发

口味改造 原&#xff1a; 改造&#xff1a; 1./** 定义口味名称和口味列表的静态数据 */ 2.改变页面样式 3.定义储存当前选中的口味列表数组&#xff0c;定义改变口味名称时更新当前的口味列表 4.改变页面样式 6.格式转换 7.定义口味列表获取焦点时更新当前选中的口味列表

【DGL系列】简单理解graph.update_all和spmm的区别

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景介绍 源码分析 小结一下 背景介绍 我们在看GNN相关的论文时候&#xff0c;都会说到邻接矩阵与特征矩阵之间是用到了spmm&#xff0c;在很久…

深入理解Linux网络(二):UDP接收内核探究

深入理解Linux网络&#xff08;二&#xff09;&#xff1a;UDP接收内核探究 一、UDP 协议处理二、recvfrom 系统调⽤实现 一、UDP 协议处理 udp 协议的处理函数是 udp_rcv。 //file: net/ipv4/udp.c int udp_rcv(struct sk_buff *skb) {return __udp4_lib_rcv(skb, &udp_…

c++ 元组实验

在C中&#xff0c;元组&#xff08;tuple&#xff09;是一种可以存储不同类型元素的数据结构。C11引入了<tuple>库&#xff0c;使得在C中使用元组变得更加容易。下面是一个简单的C元组实验&#xff0c;展示了如何创建元组、访问元组元素以及使用std::get和std::tie等函数…

【Vue3】选项式 API

【Vue3】选项式 API 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。…

thinkphp6连接kingbase数据库

在/vendor/topthink/think-orm/src/db/connector中将Pgsql.php和pgsql.sql文件复制后改名为Kingbase.php和Kingbase.sql Kingbase.php <?php // ---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // …

MySQL中EXPLAIN关键字详解

昨天领导突然问到&#xff0c;MySQL中explain获取到的type字段中index和ref的区别是什么。 这两种状态都是在使用索引后产生的&#xff0c;但具体区别却了解不多&#xff0c;只知道ref相比于index效率更高。 因此&#xff0c;本文较为详细地记录了MySQL性能中返回字段的含义、状…