C#通过重写虚方法实现加、减、乘、除运算 通过多态确定人类的说话行为

目录

一、涉及到的知识点1

1.虚方法

2.重写方法

3.重写方法与重载方法的区别

4.通过KeyPressEventArgs.KeyChar限制键盘输入的内容

5.if-else if-else嵌套转换为switch case 

二、 涉及到的知识点2

1.多态性

2.使用多态性的注意事项

3. 使用虚方法实现多态性

三、实例1:重写虚方法

1.源码

2.生成效果

四、实例2:多态性 

1.源码

2.生成效果 


一、涉及到的知识点1

1.虚方法

        通过virtual关键字修饰的方法被称为虚方法,虚方法可以被其子类重写。

         虚方法就是允许被其子类重新定义的方法,在声明时,需要使用virtual修饰符

virtual修饰符不能与static、abstract或者override修饰符同时使用。
由于虚方法不能是私有的,所以virtual修饰符不能与private修饰符同时使用。

2.重写方法

        如果一个方法声明中含有override修饰符,则称该方法为重写方法,它主要用来使用相同的签名重写继承的虚方法。虚方法主要用来引入新方法,而重写方法则使从基类继承而来的虚方法专用化(提供虚方法的具体实现)。

        override修饰符不能与new、static或者virtual修饰符同时使用。另外,重写方法只能用于重写基类中的虚方法,不能用来单独声明方法。

3.重写方法与重载方法的区别

        重写方法与重载方法是不相同的,重写方法是指在派生类中重写基类的虚方法;而重载方法是指编写一个与已有方法同名,但参数列表不同的方法。

4.通过KeyPressEventArgs.KeyChar限制键盘输入的内容

    在C#中,KeyPressEventArgs.KeyChar是与KeyPress事件相关联的事件参数类KeyPressEventArgs的一个属性。它提供有关事件的按键信息。
        KeyPressEventArgs.KeyChar属性返回一个char值,表示按下的键的字符。如果按下的键不生成字符(例如功能键或箭头键),则该属性将返回一个空字符(‘\0’)。

        本例中,通过KeyPressEventArgs.KeyChar属性对键盘输入进行判断是否‘0~9’、是否回车、是否回退键。

/// <summary>
/// 这段代码是一个事件处理程序,用于处理 TextBox1 控件的 KeyPress 事件。
/// 它确保用户在 TextBox1 中输入的字符
/// 仅限于数字(0-9)和回车键(\r)以及退格键(\b)。
/// </summary>
private void TextBox1_KeyPress(object? sender, KeyPressEventArgs e)
{if (!(e.KeyChar <= '9' && e.KeyChar >= '0') && e.KeyChar != '\r' && e.KeyChar != '\b'){e.Handled = true;}
}

5.if-else if-else嵌套转换为switch case 

         转换后,程序更易读和简练。

        详见实例中的源码。

二、 涉及到的知识点2

1.多态性

        多态性可以简单地概括为“一个接口,多种方法”,它是在程序运行的过程中才决定调用的方法,多态性是面向对象编程的核心概念。

        多态使得子类(派生类)的实例可以直接赋予基类的对象(这里不需要进行强制类型转换),然后直接就可以通过这个对象调用子类(派生类)的方法。

2.使用多态性的注意事项

        多态性主要是用于实现接口重用,因为接口是程序开发中最耗费时间的资源,实质上设计一个接口要比设计一堆类要显得更有效率。

        多态性在C#中主要通过虚方法和重写方法来体现。

3. 使用虚方法实现多态性

        首先在基类中定义虚方法,每一个子类都重写基类的虚方法,采用基类的对象引用子类实例的方法创建对象,这样会产生很多基类的对象,使用每一个基类的对象调用虚方法时会调用不同子类重写基类的方法,这样就实现了多态性。

三、实例1:重写虚方法

        本实例将通过重写虚方法实现两个数相加,具体实现时,首先在Operation类中定义一个虚方法Operators,用于实现两个数相乘;然后创建一个子类Addition,继承自Operation类,在子类中重写虚方法Operators,实现两个数相加。依此类推。

1.源码

// 重写虚方法实现+-*/运算
namespace _119
{public partial class Form1 : Form{private TextBox? textBox1;private ComboBox? comboBox1;private TextBox? textBox2;private Label? label1;private TextBox? textBox3;private Button? button1;public Form1(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // textBox1// textBox1 = new TextBox{Location = new Point(12, 20),Name = "textBox1",Size = new Size(50, 23),TabIndex = 0};textBox1.KeyPress += TextBox1_KeyPress;// // comboBox1// comboBox1 = new ComboBox{FormattingEnabled = true,Location = new Point(68, 18),Name = "comboBox1",Size = new Size(43, 25),TabIndex = 1};comboBox1.Items.AddRange(["×","+","-","/"]);// // textBox2// textBox2 = new TextBox{Location = new Point(117, 20),Name = "textBox2",Size = new Size(50, 23),TabIndex = 2};textBox2.KeyPress += TextBox2_KeyPress;// // label1// label1 = new Label{AutoSize = true,Location = new Point(173, 26),Name = "label1",Size = new Size(17, 17),TabIndex = 3,Text = "="};// // textBox3// textBox3 = new TextBox{Location = new Point(196, 20),Name = "textBox3",Size = new Size(76, 23),TabIndex = 4};// // button1// button1 = new Button{Location = new Point(220, 56),Name = "button1",Size = new Size(52, 23),TabIndex = 5,Text = "计算",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(284, 91);Controls.Add(button1);Controls.Add(textBox3);Controls.Add(label1);Controls.Add(textBox2);Controls.Add(comboBox1);Controls.Add(textBox1);Name = "Form1";Text = "重写虚方法实现加法";}private void Button1_Click(object? sender, EventArgs e){if (textBox1!.Text == "" || textBox2!.Text == ""){MessageBox.Show("请输入数字", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);}//else//{//    if (comboBox1!.SelectedIndex == 0)//    {//        Operation multiplication = new();//原始虚方法进行乘法运算//        textBox3!.Text = multiplication.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();//    }//    else if (comboBox1!.SelectedIndex == 1)//    {//        Operation addition = new Addition();//        textBox3!.Text = addition.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();//    }//    else if (comboBox1!.SelectedIndex == 2)//    {//        Operation minus = new Minus();//        textBox3!.Text = minus.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();//    }//    else//    {//        Operation division  = new Division();//        textBox3!.Text = division.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();//    }//}// 转换为Switch语句else{switch (comboBox1!.SelectedIndex){case 0:{Operation multiplication = new();//原始虚方法进行乘法运算textBox3!.Text = multiplication.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();break;}case 1:{Operation addition = new Addition();textBox3!.Text = addition.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();break;}case 2:{Operation minus = new Minus();textBox3!.Text = minus.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();break;}default:{Operation division = new Division();textBox3!.Text = division.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();break;}}}}/// <summary>/// 这段代码是一个事件处理程序,用于处理 TextBox1 控件的 KeyPress 事件。/// 它确保用户在 TextBox1 中输入的字符/// 仅限于数字(0-9)和回车键(\r)以及退格键(\b)。/// </summary>private void TextBox1_KeyPress(object? sender, KeyPressEventArgs e){if (!(e.KeyChar <= '9' && e.KeyChar >= '0') && e.KeyChar != '\r' && e.KeyChar != '\b'){e.Handled = true;}}/// <summary>/// 这段代码是一个事件处理程序,用于处理 TextBox1 控件的 KeyPress 事件。/// 它确保用户在 TextBox1 中输入的字符/// 仅限于数字(0-9)和回车键(\r)以及退格键(\b)。/// </summary>private void TextBox2_KeyPress(object? sender, KeyPressEventArgs e){if (!(e.KeyChar <= '9' && e.KeyChar >= '0') && e.KeyChar != '\r' && e.KeyChar != '\b'){e.Handled = true;}}/// <summary>/// 建立的虚方法,可以在子类中被重写/// </summary>class Operation{public virtual double Operators(int x, int y){return x * y;}}/// <summary>/// 在子类中重写虚方法,改写为加法/// </summary>class Addition : Operation{public override double Operators(int x, int y){return (x + y);}}/// <summary>/// 依次在子类中重写虚方法,改写为减法/// </summary>class Minus : Operation{public override double Operators(int x, int y){return (x - y);}}/// <summary>/// 依次在子类中重写虚方法,改写为除法/// </summary>class Division : Operation{public override double Operators(int x, int y){return (float)x / y;}}}
}

2.生成效果

 

四、实例2:多态性 

        日常生活中经常说的开电视、开电脑、开音箱等,这里的“开”其实就是多态。

        本实例通过使用类的多态性来确定人类的说话行为。运行本实例,首先在文本框中输入人的姓名,然后单击“确定”按钮,在RichTextBox控件中分别显示人的“说汉语”和“说英语”行为。

1.源码

// 通过类的多态性确定人类的说话行为
namespace _120
{public partial class Form1 : Form{private Label? label1;private TextBox? textBox1;private Button? button1;private RichTextBox? richTextBox1;public Form1(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // label1// label1 = new Label{AutoSize = true,Location = new Point(12, 14),Name = "label1",Size = new Size(68, 17),TabIndex = 0,Text = "输入姓名:"};// // textBox1// textBox1 = new TextBox{Location = new Point(86, 8),Name = "textBox1",Size = new Size(125, 23),TabIndex = 1};// // button1// button1 = new Button{Location = new Point(217, 8),Name = "button1",Size = new Size(75, 23),TabIndex = 2,Text = "确定",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // richTextBox1// richTextBox1 = new RichTextBox{Location = new Point(12, 42),Name = "richTextBox1",Size = new Size(280, 72),TabIndex = 3,Text = ""};// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(304, 126);Controls.Add(richTextBox1);Controls.Add(button1);Controls.Add(textBox1);Controls.Add(label1);Name = "Form1";Text = "类的多态性确定说话行为";}private void Button1_Click(object? sender, EventArgs e){if (textBox1!.Text == ""){Console.WriteLine("请输入姓名:");return;}richTextBox1!.Clear();string strName = textBox1.Text;People[] people =[new Chinese(),    //使用第一个派生类对象初始化数组的第一个元素new American(),   //使用第二个派生类对象初始化数组的第二个元素];                    //声明People类型数组for (int i = 0; i < people.Length; i++)     //遍历赋值后的数组{people[i].Say(richTextBox1, strName);   //根据数组元素调用相应派生类中的重写方法}}}/// <summary>/// 定义基类/// 定义虚方法,表示人的说话行为/// </summary>class People{public virtual void Say(RichTextBox rtbox, string name){rtbox.Text += name;}}/// <summary>/// 定义派生类,继承于基类/// 重写基类中的虚方法/// </summary>class Chinese : People{public override void Say(RichTextBox rtbox, string name){base.Say(rtbox, name + "说汉语!\n");}}/// <summary>/// 定义派生类,继承于基类/// 再次重写基类中的虚方法/// </summary>class American : People{public override void Say(RichTextBox rtbox, string name){base.Say(rtbox, name + "说英语!");}}
}

2.生成效果 

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

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

相关文章

黑马Java——集合进阶(不可变集合、Stream流、方法引用)

目录 一、不可变集合 1、创建不可变集合的应用场景 2、创建不可变集合的书写格式 2.1、不可变的List集合 2.2、不可变的Set集合 2.3、不可变的Map集合 3、小结 二、Stream流 1、体验Stream流的作用 2、Stream流的思想 3、Stream流的使用步骤 3.1、单列集合获取Strea…

站在C/C++的肩膀速通Java面向对象

默认学过C或C&#xff0c;对变量、表达式、选择、循环都会。 运行特征 解释型语言&#xff08;JavaScript、Python等&#xff09; 源文件-(平台专属解释器)->解释器中执行编译型语言&#xff08;C、Go等&#xff09; 源文件-(平台编译器)->平台可执行文件Java 源文件-(…

【白话前端】JS库的作用和常见的九种类型—值得收藏

js库就好比预制菜&#xff0c;我们想吃美食没必要从买菜、择菜、炒菜开始&#xff0c;直接加工就行。 一、什么是JS库 JS库&#xff08;JavaScript Library&#xff09;是指一组封装好的函数、方法、类等&#xff0c;用于简化开发者的编程工作。它们通常提供了常用的功能和算…

Android ·移动应用开发 创建第一个Android项目

文章目录 一、创建第一个Android项目1.1 准备好Android Studio1.2 运行程序1.3 程序结构是什么app下的结构res - 子目录&#xff08;所有图片、布局、字符串等资源&#xff09;AndroidManifest.xml 有四大组件&#xff0c;程序添加权限声明 Project下的结构 二、开发android时&…

【ArcGIS Pro二次开发】(79):符号系统_CIMUniqueValueRenderer

CIMUniqueValueRenderer是ArcGIS Pro SDK中的一个类&#xff0c;用于创建唯一值渲染器&#xff08;Unique Value Renderer&#xff09;。 在ArcGIS Pro中长这样&#xff1a; 通过对CIMUniqueValueRenderer的操作&#xff0c;可以对符号系统进行更改&#xff0c;实现很多功能。…

尚硅谷最新Node.js 学习笔记(一)

目录 一、Nodejs入门 1.1、为什么要学习Nodejs&#xff1f; 1.2、Nodejs是什么&#xff1f; 1.3、Nodejs的作用 1.4、Nodejs安装 1.5、Nodejs初体验 1.6、编码注意事项 二、Buffer&#xff08;缓冲器&#xff09; 2.1、概念 2.2、特点 2.3、使用 创建Buffer Buffe…

Cocos2dx-lua ScrollView[一]基础篇

一.ScrollView概述 cocos游戏中ScrollView控件大量使用,95%以上的项目都会使用ScrollView,个别游戏可能全部使用翻页的滑动效果。如果想要精通Cocos的UI开发,精通ScrollView控件非常关键,因此对ScrollView的使用进行总结很有必要。 下文缩写说明:sv = ScrollView, item代…

嵌入式Linux网络编程入门:轻松构建网络通信

大家好&#xff0c;今天给大家介绍嵌入式Linux网络编程入门&#xff1a;轻松构建网络通信&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 为什么选择嵌入式Linux网络编程&#x…

vue3+ts+vite+uniapp项目常见问题

vue3tsvite中""路径失效的问题 ""需要进行配置&#xff1a; 首先npm install types/node --save-dev&#xff08;需要用到node其中的path&#xff09;接着在vite.config.ts配置文件中进行配置&#xff1a; 引入 import path from ‘path’&#xff0c;然…

Imgui(2) | macOS 绘制 CPU 占用率曲线

Imgui(2) | macOS 绘制 CPU 占用率曲线 文章目录 Imgui(2) | macOS 绘制 CPU 占用率曲线0. 简介1. 绘制曲线 - 以正弦函数为例1.1 基于 sf::RectangleShape 的渲染 - 不好看&#xff0c;效率低1.2 基于 sf::VertexArray 的绘制 2. 获取和绘制所有 CPU 的占用率2.1 测试程序 - 用…

LeetCode Python - 16.最接近的三数之和

目录 题目答案运行结果 题目 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4],…

基于轻量级卷积神经网络模型MobileNet开发构建基于GTSRB数据集的道路交通标识识别系统

相信经常需要开车出行的人对于各种各样的道路交通标识定是不陌生的&#xff0c;但是对于经常不开车的人来说生活中出现的形形色色的道路交通标识就未必都能认出来了&#xff0c;本文的主要目的就是想要基于CNN来开发构建道路交通标识识别分析系统&#xff0c;实现看图识标&…

谷歌浏览器安装扩展程序axure-chrome-extension

注&#xff1a; 文末附扩展附件&#xff1a;axure-chrome-extension_v0.7.0.crx 1、安装扩展程序axure-chrome-extension 找到axure-chrome-extension.crx&#xff0c;把axure-chrome-extension.crx后缀改为zip&#xff0c;然后解压&#xff0c;得到一个文件夹 2、打开谷歌浏览…

枚举知识点解析

枚举是什么&#xff1f;枚举就是列举&#xff0c; 将东西一一列举出来。 生活中有许多地方需要用到枚举&#xff0c; 比如一年有12个月&#xff0c;一星期有7天&#xff0c; 这些都需要进行枚举。 那么&#xff0c; 如何进行枚举的定义呢&#xff1f; 如下 枚举中的值是一种…

ubuntu22.04@laptop OpenCV Get Started: 008_image_filtering_using_convolution

ubuntu22.04laptop OpenCV Get Started: 008_image_filtering_using_convolution 1. 源由2. convolution应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 重点分析3.1 identity矩阵3.2 all ones 5x5矩阵3.3 blur 5x5矩阵3.4 GaussianBlur 5x5矩阵3.5 medianBlur 5x5矩阵3.6 Sharpe…

Spring 用法学习总结(一)之基于 XML 注入属性

百度网盘&#xff1a; &#x1f449; Spring学习书籍链接 Spring学习 1 Spring框架概述2 Spring容器3 基于XML方式创建对象4 基于XML方式注入属性4.1 通过set方法注入属性4.2 通过构造器注入属性4.3 使用p命名空间注入属性4.4 注入bean与自动装配4.5 注入集合4.6 注入外部属性…

C# Winform .net6自绘的圆形进度条

using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;namespace Net6_GeneralUiWinFrm {public class CircularProgressBar : Control{private int progress 0;private int borderWidth 20; // 增加的边框宽度public int Progr…

CTFshow web(php文件上传155-158)

web155 老样子&#xff0c;还是那个后端检测。 知识点&#xff1a; auto_append_file 是 PHP 配置选项之一&#xff0c;在 PHP 脚本执行结束后自动追加执行指定的文件。 当 auto_append_file 配置被设置为一个文件路径时&#xff0c;PHP 将在执行完脚本文件的所有代码后&…

探索IDE的世界:什么是IDE?以及适合新手的IDE推荐

引言 在编程的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;是我们日常工作的重要工具。无论是初学者还是经验丰富的开发者&#xff0c;一个好的IDE都能极大地提高我们的编程效率。那么&#xff0c;什么是IDE呢&#xff1f;对于新手来说&#xff0c;又应该选择哪…

OpenGL-ES 学习(2)---- DepthTest

深度测试 OpenGL-ES 深度测试是指在片段着色器执行之后&#xff0c;利用深度缓冲区所保存的深度值决定当前片段是否被丢弃的过程 深度缓冲区通常和颜色缓冲区有着相同的宽度和高度&#xff0c;一般由窗口系统自动创建并将其深度值存储为 16、 24 或 32 位浮点数。(注意只保存…