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…...
数据库、数据仓库、数据中台、数据湖相关概念
文章目录 序言1数据库,数据仓库,数据中台,数据湖-概念对比释义1.1概念产生的时间顺序1.2在使用功能方面对比1.3在使用工具方面对比 2数据仓库2.1数据仓库的发展阶段2.2 数据仓库的设计2.3数据仓库常用工具,方法2.3.1分析型数据库和…...

实践提炼,EtherNet/IP转PROFINET网关实现乳企数字化工厂增效
乳企数字化工厂的核心技术应用 1. 智能质检:机器视觉协议网关的协同 液态奶包装线(利乐罐装)的漏码检测生产线,其高速产线(20,000包/小时)需实时识别微小缺陷,但视觉系统(康耐视Ca…...
F(x, y, z) = 0 隐函数微分 确定自变量
多元隐函数偏导的通用公式: 设一个隐函数由三元函数定义: F ( x , y , z ) 0 F(x, y, z) 0 F(x,y,z)0 且假设 z z ( x , y ) z z(x, y) zz(x,y),即 z z z 是 x , y x, y x,y 的函数,满足这个等式恒成立。则有以下公式&am…...
八:操作系统设备管理之缓冲、缓存与假脱机
弥合鸿沟:操作系统中的缓冲、缓存与假脱机技术深度解析 在计算机系统的世界里,存在着一个根本性的速度差异:中央处理器(CPU)的执行速度飞快,而输入/输出(I/O)设备(如硬盘…...

建造者模式深度解析与实战应用
作者简介 我是摘星,一名全栈开发者,专注 Java后端开发、AI工程化 与 云计算架构 领域,擅长Python技术栈。热衷于探索前沿技术,包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践,乐于分享实战经验与…...
知识拓展卡————————关于Access、Trunk、Hybrid端口
目录 什么是Trunk List、VLAN ID、PVID: VLAN ID(Virtual Local Area Network Identifier): Trunk List(Trunk列表): PVID(Prot VLAN ID): 关于Native VLAN &#x…...
C++ map基础概念、map对象创建、map赋值操作、map大小操作、map数据插入、map数据删除、map数据修改、map数据统计
map的使用频率很高,仅次于vector,先了解下pair的概念: pair 概念: template<class _Ty1, class Ty2> struct pair{ _Ty1 first; // 这两个可以是任意的类型 _Ty2 second; }; eg:pair<int, int> p(13,…...
嵌入式链表操作原理详解
嵌入式链表操作原理详解 链表是嵌入式软件开发中最基础的数据结构之一,其设计采用嵌入式链表节点的思想,实现了高度通用的链表管理机制。以下是核心原理和操作的全面解析: 一、基础数据结构 struct list_head {struct list_head *next, *pr…...

单片机的低功耗模式
什么是低功耗? STM32的低功耗(low power mode)特性是其嵌入式处理器系列的一个重要优势,特别适用于需要长时间运行且功耗敏感的应用场景,如便携式设备、物联网设备、智能家居系统等。 在很多应用场合中都对电子设备的…...
es地理信息索引的类型以及geo_point和geo_hash的关系
Elasticsearch中地理信息索引的主要数据类型有两种: geo_point:用于存储单个地理点坐标(如纬度/经度),支持精确位置查询和基于距离的搜索操作。geo_shape:用于存储复杂的地理形状(如点、线、多…...