C#利用接口实现选择不同的语种
目录
一、涉及到的知识点
1.接口定义
2.接口具有的特征
3.接口通过类继承来实现
4.有效使用接口进行组件编程
5.Encoding.GetBytes(String)方法
(1)检查给定字符串中是否包含中文字符
(2)编码和还原前后
6.Encoding.GetString(Byte[])方法
(1)示例
二、实例
1. 源码
2.生成效果
一、涉及到的知识点
1.接口定义
接口是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为,可以把它看成是实现一组类的模板。接口可由方法、属性、事件和索引器或这4种成员类型的任何组合构成,但不能包含字段。类和结构可以像类继承基类一样从接口继承,但是可以继承多个接口。当类或结构继承接口时,它继承成员定义但不继承实现。若要实现接口成员,类或结构中的对应成员必须是公共的、非静态的,并且与接口成员具有相同的名称和签名。类或结构的属性和索引器可以为接口中定义的属性或索引器定义额外的访问器。例如,接口可以声明一个带有get访问器的属性,而实现该接口的类可以声明同时带有get和set访问器的同一属性。但是,如果属性或索引器使用显式实现,则访问器必须匹配。
另外,接口也可以继承其他接口,类可以通过其继承的基类或接口多次继承某个接口,在这种情况下,如果将该接口声明为新类的一部分,则类只能实现该接口一次。如果没有将继承的接口声明为新类的一部分,其实现将由声明它的基类提供。基类可以使用虚拟成员实现接口成员。在这种情况下,继承接口的类可通过重写虚拟成员来更改接口行为。
C#中使用interface关键字声明接口,语法格式如下:
修饰符 interface接口名称:继承的接口列表
{//接口内容;
}
说明:
声明接口时,通常以大写字母“I”开头。
声明接口时,除interface关键字和接口名称外,其他的都是可选项。
可以使用new、public、protected、internal和private等修饰符声明接口,但接口成员必须是公共的。
2.接口具有的特征
- 接口类似于抽象基类,继承接口的任何非抽象类型都必须实现接口的所有成员。
- 不能直接实例化接口。
- 接口可以包含事件、索引器、方法和属性。口 接口不包含方法的实现。
- 类和结构可从多个接口继承。
- 接口自身可从多个接口继承。
3.接口通过类继承来实现
一个类虽然只能继承一个基类,但可以继承任意多个接口。声明实现接口的类时,需要在基类列表中包含类所实现的接口的名称。
C#中实现继承的语法格式如下:
class DerivedClass:BaseClass {}
说明:
继承接口时,必须在子类和接口之间用冒号(:)。
另外,如果继承多个接口,那么在继承的每个接口之间用逗号(,)分隔。
4.有效使用接口进行组件编程
接口使得服务的协议与实现相分离,它是组件编程的基础,在组件编程中,接口是组件向外公布其功能的唯一方法。
5.Encoding.GetBytes(String)方法
C# 中的 Encoding.GetBytes(String) 方法用于将指定的字符串转换为字节数组。该方法属于 System.Text.Encoding 类,它提供了用于将字符转换为字节以及将字节转换为字符的静态方法。
public static byte[] GetBytes(string str);参数
str String
包含要编码的字符的字符串。返回
Byte[]
一个字节数组,包含对指定的字符集进行编码的结果。
在本例中,使用该方法把字符串编码为UnicodeEncoding序列。
(1)检查给定字符串中是否包含中文字符
- 在循环中,每次迭代都会检查当前字节的下一个字节(索引 i+1 处的字节)是否不等于 0。因为在 Unicode 编码中,一个中文字符通常由两个字节表示,所以如果下一个字节不等于 0,则表示当前字节表示的是一个中文字符的一部分。
- 如果发现中文字符,将
flag设置为true。否则,将flag保持为false。 - 循环结束后,返回
flag的值,表示是否在字符串中找到了中文字符。
/// <summary>
/// 检查给定字符串中是否包含中文字符
/// </summary>
public static bool IsChineseChecked(string str)
{bool flag = false;UnicodeEncoding a = new();byte[] bt = a.GetBytes(str);//在派生类中重写时,将指定字符数组中的所有字符编码为一个字节序列。for (int i = 0; i < bt.Length; i++){i++;if (bt[i] != 0){flag = true;}else{flag = false;}}return flag;
}
(2)编码和还原的前后
编码的结果是获得一序列数字表达的字节数组。
还原的结果就是把编码还原到源字符串。
// 使用 Encoding.UTF8.GetBytes(String) 方法编码为字节数组
// 使用 Encoding.UTF8.GetString(byte[]) 方法还原为字符串
using System.Text;namespace _117_1
{class Program{static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);string str = "Hello, World!";byte[] bytes = Encoding.UTF8.GetBytes(str);Console.WriteLine("Original string: " + str);Console.WriteLine("Byte array length: " + bytes.Length);Console.WriteLine("Byte array: " + string.Join(", ", bytes));// 转换回字符串string backToString = Encoding.UTF8.GetString(bytes);Console.WriteLine("Back to string: " + backToString);Console.WriteLine("********************************");string str1 = "万里长城";byte[] bytes1 = Encoding.UTF8.GetBytes(str1);Console.WriteLine("源字符串:" + str1);Console.WriteLine("Byte array length: " + bytes1.Length);Console.WriteLine("Byte array: " + string.Join(", ", bytes1));// 转换回字符串string backToString1 = Encoding.UTF8.GetString(bytes1);Console.WriteLine("还原到源字符串:" + backToString1);}}
}
//运行结果:
/*
Original string: Hello, World!
Byte array length: 13
Byte array: 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33
Back to string: Hello, World!
********************************
源字符串:万里长城
Byte array length: 12
Byte array: 228, 184, 135, 233, 135, 140, 233, 149, 191, 229, 159, 142
还原到源字符串:万里长城*/
6.Encoding.GetString(Byte[])方法
C# 中的Encoding.GetString(byte[])方法用于将字节数组解码为字符串。它属于System.Text.Encoding类,该类提供了用于将字符转换为字节以及将字节转换为字符的静态方法和属性。
public virtual string GetString (byte[] bytes);
参数
bytes Byte[]
包含要解码的字节序列的字节数组。返回
String
包含指定字节序列解码结果的字符串。
(1)示例
// 使用 Encoding.GetString(byte[]) 方法
using System.Text;namespace _117_2
{internal class Program{private static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);// 创建一个 Unicode 编码实例Encoding unicodeEncoding = Encoding.UTF8;// 定义一个字节数组,包含一些 Unicode 字符的字节表示byte[] bytes = [0x04, 0x41, 0x04, 0x42, 0x04, 0x43];// 使用 Unicode 编码将字节数组解码为字符串string decodedString = unicodeEncoding.GetString(bytes);// 输出解码后的字符串Console.WriteLine(decodedString); }}
}
//运行结果:
/*
ABC*/
二、实例
在程序中可以建立一个接口,该接口定义一个方法用于对话,而对话这个方法是在类中实现的。分别创建一个中国人的类和一个美国人的类,这两个类都继承自接口,在中国人的类中说汉语,在美国人的类中说英语,当和不同国家的人交流时,实例化接口,并调用相应类中的方法即可。
1. 源码
//
using System.Text;namespace _117
{public partial class Form1 : Form{private Label? label1;private Button? button1;private ComboBox? comboBox1;private TextBox? textBox1;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, 18),Name = "label1",Size = new Size(80, 17),TabIndex = 0,Text = "选择对话人:"};// // button1// button1 = new Button{Location = new Point(226, 12),Name = "button1",Size = new Size(75, 23),TabIndex = 2,Text = "对话",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // comboBox1// comboBox1 = new ComboBox{FormattingEnabled = true,Location = new Point(98, 12),Name = "comboBox1",Size = new Size(121, 25),TabIndex = 3,//SelectedIndex = 0};comboBox1.Items.AddRange(["中国人","美国狗"]);// // textBox1// textBox1 = new TextBox{Location = new Point(12, 43),Multiline = true,Name = "textBox1",Size = new Size(290, 161),TabIndex = 4};// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(314, 216);Controls.Add(textBox1);Controls.Add(comboBox1);Controls.Add(button1);Controls.Add(label1);Name = "Form1";Text = "用接口实现不同语种谈话";}/// <summary>/// 按钮事件/// 选择通话对象的语种,并输入该语种的通话内容/// </summary>private void Button1_Click(object? sender, EventArgs e){if (textBox1!.Text == ""){MessageBox.Show("不想说点什么吗?", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;}else{if (comboBox1!.SelectedIndex == 0)//与中国人对话{if (IsChineseChecked(textBox1.Text)){ISelectLanguage Interface1 = new C_SpeakChinese();Interface1.Speak(textBox1.Text);}else{MessageBox.Show("和中国人说汉语 ", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;}}else//与美国人对话{if (IsChineseChecked(textBox1.Text)){MessageBox.Show("和米国狗说英语! ", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;}else{ISelectLanguage Interface1 = new C_SpeakEnglish();Interface1.Speak(textBox1.Text);}}}}/// <summary>/// 声明一个接口,用于定义Seak方法,而具体Speak方法功能的实现是在类中进行的/// </summary>interface ISelectLanguage{void Speak(string str);}/// <summary>/// 如果跟中国人对话,则说汉语/// </summary>class C_SpeakChinese : ISelectLanguage{public void Speak(string str){MessageBox.Show("对中国人说:" + str, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}}/// <summary>/// 如果跟美国人对话,则说英语/// </summary>class C_SpeakEnglish : ISelectLanguage{public void Speak(string str){MessageBox.Show("对美国狗说:" + str, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}}public static bool IsChineseChecked(string str){bool flag = false;UnicodeEncoding a = new();byte[] bt = a.GetBytes(str);//在派生类中重写时,将指定字符数组中的所有字符编码为一个字节序列。for (int i = 0; i < bt.Length; i++){i++;if (bt[i] != 0){flag = true;}else{flag = false;}}return flag;}}
}
2.生成效果


相关文章:
C#利用接口实现选择不同的语种
目录 一、涉及到的知识点 1.接口定义 2.接口具有的特征 3.接口通过类继承来实现 4.有效使用接口进行组件编程 5.Encoding.GetBytes(String)方法 (1)检查给定字符串中是否包含中文字符 (2)编码和还原前后 6.Encoding.GetS…...
设计模式-适配器模式 Adapter
适配器模式 (Adapter) (重点) 适配器设计模式(Adapter Design Pattern)是一种结构型设计模式,用于解决两个不兼容接口之间的问题。适配器允许将一个类的接口转换为客户端期望的另一个接口,使得原本由于接口不兼容而不能一起工作的…...
算法训练day29Leetcode491递增子序列46全排列47全排列Ⅱ
491 递增子序列 题目描述 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一…...
内网穿透与搭建私人服务器
前言 内网穿透是一种技术,允许用户从外部网络访问内部私有网络中的服务器或设备。这对于想要从任何地方访问家中或办公室内部网络资源的用户非常有用。以下是为初学者准备的关于如何实现内网穿透以及搭建自己的私人服务器的详细指南。 在这个数字化时代,…...
交大论文下载器
原作者地址: https://github.com/olixu/SJTU_Thesis_Crawler 问题: http://thesis.lib.sjtu.edu.cn/的学位论文下载系统,该版权保护系统用起来很不方便,加载起来非常慢,所以该下载器实现将网页上的每一页的图片合并…...
全栈笔记_浏览器扩展篇(manifest.json文件介绍)
manifest.json介绍 是web扩展技术必不可少的插件配置文件,放在根目录作用: 指定插件的基本信息 name:名称manifest_version:manifest.json文件的版本号,可以写2或3version:版本description:描述定义插件的行为: browser_action:添加一个操作按钮到浏览器工具栏,点击按…...
蓝桥杯每日一题(python)
##斐波那契数列的应用 --- 题目斐波那契 题目: 如果数组 A (a0, a1, , an−1) 满足以下条件,就说它是一个斐波那契数组: 1. n ≥ 2; 2. a0 a1; 3. 对于所有的 i(i ≥ 2),都满足 ai ai−1 ai−2…...
【Vue】工程化开发脚手架Vue CLI
📝个人主页:五敷有你 🔥系列专栏:Vue⛺️稳重求进,晒太阳 工程化开发&脚手架Vue CLI 基本介绍 Vue Cli是Vue官方提供的一个全局命令工具 可以帮助我们快速创建一个开发Vue项目的标准化基础架子【集成了we…...
嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第三天-ARM Linux ADC和触摸屏开发 (物联技术666)
链接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码:1688 教学内容: 1、ADC S3C2440的A/D转换器包含一个8通道的模拟输入转换器,可以将模拟输入信号转换成10位数字编码。 在A/D转换时钟频率为2.5MHz时&…...
LeetCode “AddressSanitizer:heat-use-after-free on address“问题解决方法
heat-use-after-free : 访问堆上已经被释放的内存地址 现象:同样代码在LeetCode上报错,但是自己在IDE手动打印并不会报错 个人猜测,这个bug可能来源于LeetCode后台输出打印链表的代码逻辑问题。 问题描述 题目来自LeetCode的8…...
幸运彩票
L1-6 幸运彩票 分数 15 作者 陈越 单位 浙江大学 彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断…...
搭建yum仓库服务器
安装 1.安装linux 1.1安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 1.2下载 cd /opt/nginx wget http://nginx.org/download/nginx-1.25.3.tar.gz 1.3解压 tar -xvf nginx-1.25.3.tar.gz 1.4配置 cd nginx-1.25.3 ./configure --pre…...
贪心算法练习day1
练习1--翻硬币 1)题目及要求 2)解题思路 输入的是字符串,要想将两组字符串进行一一对比,需要将字符串转换成字符数组,再使用for循环依次遍历字符数组,进行比对。 输入两行字符串,转换成两个字…...
[VulnHub靶机渗透] WestWild 1.1
🍬 博主介绍👨🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…...
如何使用 ControlValueAccessor 在 Angular 中创建自定义表单控件
简介 在 Angular 中创建表单时,有时您希望拥有一个不是标准文本输入、选择或复选框的输入。通过实现 ControlValueAccessor 接口并将组件注册为 NG_VALUE_ACCESSOR,您可以将自定义表单控件无缝地集成到模板驱动或响应式表单中,就像它是一个原…...
视频讲解:优化柱状图
你好,我是郭震 AI数据可视化 第三集:美化柱状图,完整视频如下所示: 美化后效果前后对比,前: 后: 附完整案例源码: util.py文件 import platformdef get_os():os_name platform.syst…...
OpenAI宣布ChatGPT新增记忆功能;谷歌AI助理Gemini应用登陆多地区
🦉 AI新闻 🚀 OpenAI宣布ChatGPT新增记忆功能,可以自由控制内存,提供个性化聊天和长期追踪服务 摘要:ChatGPT新增的记忆功能可以帮助AI模型记住用户的提问内容,并且可以自由控制其内存。这意味着用户不必…...
Solidworks:平面草图练习
继续练习平面草图,感觉基本入门了。...
React18原理: 渲染与更新时的重点关注事项
概述 react 在渲染过程中要做很多事情,所以不可能直接通过初始元素直接渲染还需要一个东西,就是虚拟节点,暂不涉及React Fiber的概念,将vDom树和Fiber 树统称为虚拟节点有了初始元素后,React 就会根据初始元素和其他可…...
嵌入式I2C 信号线为何加上拉电阻(图文并茂)
IIC 是一个两线串行通信总线,包含一个 SCL 信号和 SDA 信号,SCL 是时钟信号,从主设备发出,SDA 是数据信号,是一个双向的,设备发送数据和接收数据都是通过 SDA 信号。 在设计 IIC 信号电路的时候我们会在 SC…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
