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.生成效果 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

红日靶场2学习

靶场下载来自&#xff1a; http://vulnstack.qiyuanxuetang.net/vuln/detail/3/ 靶场统一登录密码&#xff1a;1qazWSX 按大佬的说法是 环境需要模拟内网和外网两个网段&#xff0c;PC端虚拟机相当于网关服务器&#xff0c;所以需要两张网卡&#xff0c;一个用来向外网提供web…

FT2232调试记录(3)

FT2232调试记录&#xff08;1&#xff09;: FT2232调试记录&#xff08;2&#xff09;: FT2232调试记录&#xff08;3&#xff09;: FT2232 SPI读写函数: 参照SPI提供的文档&#xff1a; 工程&#xff1a; SPI 写函数&#xff1a; FT_STATUS write_byte(FT_HANDLE handle…

剑指offer——数值的整数次方

目录 1. 题目描述2. 一般思路2.1 有问题的思路2.2 全面但不高效的思路2.3 面试小提示 3. 全面又高效的思路 1. 题目描述 题目:实现函数 double Power(double base,int exponent)&#xff0c;求base 的exponent 次方。不得使用库函数&#xff0c;同时不需要考虑大数问题 2. 一般…

4核16g云服务器多少钱?

4核16G服务器租用优惠价格26元1个月&#xff0c;腾讯云轻量4核16G12M服务器32元1个月、96元3个月、156元6个月、312元一年&#xff0c;阿腾云atengyun.com分享4核16服务器租用费用价格表&#xff0c;阿里云和腾讯云详细配置报价和性能参数表&#xff1a; 腾讯云4核16G服务器价…

VSCode汉化以及跳转到函数定义设置

目录 VSCode汉化设置跳转到函数定义 VSCode汉化 一、目前默认是英文状态 二、按下ShiftCtrlP弹出这个框框 三、点击语言显示配置 四、点击下载语言 五、点击下载中文即可 六、下载完后&#xff0c;再按ShiftCtrlP&#xff0c;选择语言配置 七、选择第二个&#xff0c;中…

Swift Combine 级联多个 UI 更新,包括网络请求 从入门到精通十六

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

点餐|外卖订餐小程序|基于微信小程序的外卖订餐系统设计与实现(源码+数据库+文档)

点餐|外卖订餐小程序目录 目录 基于微信小程序的外卖订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户微信端功能模块 2、管理员服务端功能模块 3、商家务端功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设…

Spring Boot整合 Cache 以Redis服务 处理数据缓存

目录 一、SpringBoot框架 二、什么是cache 三、redis介绍 四、高速缓存 一、SpringBoot框架 Spring Boot是一个基于Java的开源框架&#xff0c;用于快速构建独立的、可运行的、生产级的Spring应用程序。它简化了Spring应用程序的配置和部署过程&#xff0c;并提供了许多开…

git stash 正确用法

目录 一、背景 二、使用 2.1 使用之前&#xff0c;先简单了解下 git stash 干了什么&#xff1a; 2.2 git stash 相关命令 2.3 使用流程 1. 执行 git stash 2. 查看刚才保存的工作进度 git stash list 3. 这时候在看分支已经是干净无修改的(改动都有暂存到 stash) 4. 现在…

山脉的个数/攀登者

题目描述 攀登者喜欢寻找各种地图&#xff0c;并且尝试攀登到最高的山峰。 地图表示为一维数组&#xff0c;数组的索引代表水平位置&#xff0c;数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如&#xff1a;[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0]&#xff0c;代表如下…

代码随想录刷题笔记 DAY 26 | 组合总和 No.39 | 组合求和 II No.40 | 分割回文串 No.131

文章目录 Day 2501. 组合总和&#xff08;No. 39&#xff09;1.1 题目1.2 笔记1.3 代码 02. 组合求和 II&#xff08;No. 40&#xff09;2.1 题目2.2 笔记2.3 代码 03. 分割回文串&#xff08;No. 131&#xff09;3.1 题目3.2 笔记3.3 代码 Day 25 01. 组合总和&#xff08;No…

【计算机网络】网络层之IP协议

文章目录 1.基本概念2.协议头格式3.网段划分4.特殊的IP地址5.IP地址的数量限制6.私有IP地址和公网IP地址7.路由 1.基本概念 IP地址是定位主机的&#xff0c;具有一个将数据报从A主机跨网络可靠的送到B主机的能力。 但是有能力就一定能做到吗&#xff0c;只能说有很大的概率。…

寒假作业:2024/2/14

作业1&#xff1a;编程实现二维数组的杨辉三角 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {int n;printf("please enter n:");scanf("%d",&n);int a…

【Spring MVC篇】返回响应

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、返回静态页面…

164基于matlab的奇异值分解、小波降噪、zoom细化

基于matlab的奇异值分解、小波降噪、zoom细化。程序已调通&#xff0c;可直接运行。 164 奇异值分解 小波降噪 zoom细化 (xiaohongshu.com)

vue学习106-120

创建项目p106 router&#xff0c;store和app.vue不用删 清一下router里的路由配置 vant组件库p107 目标&#xff1a;认识第三方vue组件库vant-ui&#xff08;cv战士&#xff09; 封装好了的组件整合在一起就是组件库 http://vant-contrib.gitee.io/vant/v2/#/zh-CN/ vue2用va…

python自学...

一、稍微高级一点的。。。 1. 闭包&#xff08;跟js差不多&#xff09; 2. 装饰器 就是spring的aop 3. 多线程

开窗,挖槽,放电齿,拼版

我们在阻焊层画线&#xff0c;就相当于去掉绿油阻焊&#xff0c;开窗一般是用在大电流走线的时候。先画要走的导线&#xff0c;之后切换到TopSolder或者Bottom Solder层&#xff0c;然后Place->line 画一条和原来先粗细一样的线即可&#xff01;但走电流的仍然是导线&#x…

第21讲关于我们页面实现

关于我们页面实现 关于锋哥页面author.vue 我们这里用一个vip宣传页面&#xff0c;套一个web-view <template><web-view src"http://www.java1234.com/vip.html"></web-view> </template><script> </script><style> <…

信息学奥赛一本通1258:【例9.2】数字金字塔

1258&#xff1a;【例9.2】数字金字塔 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 44051 通过数: 26272 【题目描述】 观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以从当前点走到左下方…