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

 

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

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

相关文章

[计算机网络]---网络编程套接字

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、基础知识…

数仓建模—数据网格

数据网格 随着数字化时代的到来,近几年数据领域的新技术概念不断涌现,无论是数据湖、湖仓一体、流批一体、存算一体、数据编织抑或数据网格,很多还爬上了Gartner曲线,其中数据网格备受关注,数据网格从字面意思来看挺抽象的,会劝退很多人,但当你深入去理解这个概念时,才…

数据存储以及内存

数据在内存中的存储是因不同的类型而不同的。 但首先我们需要知道的是&#xff0c;在C语言中&#xff0c;数据在内存中的存储是以变量的形式存储的。每个变量都有一个地址&#xff0c;指向内存中的特定位置。变量的值存储在这个地址对应的内存单元中。不同类型的变量在内存中占…

react【三】受控组件/高阶组件/portals/fragment/严格模式/动画

文章目录 1、受控组件1.1 认识受控组件1.2 checkout1.3 selected1.4 非受控组件 2、高阶组件2.1 认识高阶组件2.2 应用1-props增强的基本使用2.3 对象增强的应用场景-context共享2.4 应用2-鉴权2.5 应用3 – 生命周期劫持2.6、高阶组件的意义 3、Portals4、fragment5、StrictMo…

【无标题】Matlab之annotation函数——创建图形注释(箭头、椭圆、矩形)

应用1&#xff1a;创建文本箭头注释 创建一个简单线图并向图窗添加文本箭头。用归一化的图窗坐标指定文本箭头位置&#xff0c;起点为 (0.3,0.6)&#xff0c;终点为 (0.5,0.5)。通过设置 String 属性指定文本说明。 figure plot(1:10) x [0.3 0.5]; y [0.6 0.5]; annotation…

Linux网络基础1

目录 计算机网络背景协议OSI七层模型TCP/IP五层&#xff08;四层&#xff09;模型网络传输基本流程以太网通信原理IP地址理解 计算机网络背景 到目前为止&#xff0c;我们之前所有的编程都是单机的&#xff0c;不是多机互联。以前计算机被发明的时候是为了军事用途&#xff0…

【C语言】常见字符串函数的功能与模拟实现

目录 1.strlen() 模拟实现strlen() 2.strcpy() 模拟实现strcpy() 3.strcat() 模拟实现strcat() 4.strcmp() 模拟实现strcmp() 5.strncpy() 模拟实现strncpy() 6.strncat() 模拟实现strncat() 7.strncmp() 模拟实现strncmp() 8.strstr() 模拟实现strstr() 9.str…

Midjourney绘图欣赏系列(一)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

Vulhub kali 环境安装教程

进入 root 权限 sudo su 更新软件 apt-get update 安装 HTTPS 协议和 CA 证书 apt-get install -y apt-transport-https ca-certificates 安装 docker apt install docker.io 查看 docker 是否安装完成 docker -v 安装 pip apt-get install python3-pip 安装 docker-compose do…

【python之美】减少人工成本之批量去除首行_3

批量去除首行内容 怎么创建多个文本并写入多行数据呢 上特产&#xff1a; import ospath "C:\\Users\\Administrator\\Desktop\\text_1\\" numb int(input("需要创建几个文件&#xff1a;")) a 1 for i in range(numb):f open(path text _ str(a)…

jmeter-问题四:json断言时,预期结果那里如何不写成固定值?

文章目录 json断言时&#xff0c;预期结果那里如何不写成固定值&#xff1f;定义用户参数&#xff0c;然后在json断言的expected value处引用使用csv数据&#xff0c;然后在json断言的expected value处引用 json断言时&#xff0c;预期结果那里如何不写成固定值&#xff1f; 定…

测试开发-2-概念篇

文章目录 衡量软件测试结果的依据—需求1.需求的概念2.从软件测试人员角度看需求3.为什么需求对软件测试人员如此重要4.如何才可以深入理解被测试软件的需求5.测试用例的概念6.软件错误&#xff08;BUG&#xff09;的概念7.开发模型和测试模型8.软件的生命周期9.瀑布模型&#…

Spring 用法学习总结(三)之 AOP

Spring学习 7 bean的生命周期8 AOP面向切面编程8.1 AOP相关术语8.2 AOP使用 7 bean的生命周期 bean的生命周期主要为bean实例化、bean属性赋值、bean初始化、销毁bean&#xff0c;其中在实例化和初始化前后都使用后置处理器方法&#xff0c;而InstantiationAwareBeanPostProce…

Linux之多线程

目录 一、进程与线程 1.1 进程的概念 1.2 线程的概念 1.3 线程的优点 1.4 线程的缺点 1.5 线程异常 1.6 线程用途 二、线程控制 2.1 POSIX线程库 2.2 创建一个新的线程 2.3 线程ID及进程地址空间布局 2.4 线程终止 2.5 线程等待 2.6 线程分离 一、进程与线程 在…

HDFS的超级用户

一. 解释原因 HDFS(Hadoop Distributed File System)和linux文件系统管理一样&#xff0c;也是存在权限控制的。 但是很不一样的是&#xff0c; 在Linux文件系统中&#xff0c;超级用户Superuser是root而在HDFS中&#xff0c;超级用户Superuser是启动了namenode的用户&#x…

4核16g配置咋样?还不错,阿里云4核16G服务器26元1个月

4核16g配置咋样&#xff1f;还不错&#xff0c;阿里云4核16G服务器26元1个月&#xff0c;阿里云4核16G服务器配置优惠价格ECS云服务器经济型e实例26元1个月、149元半年、79元3个月&#xff0c;4核16G通用算力u1服务器、通用型g7、通用型g8i、AMD通用型g8a、性能增强通用型g8ae、…

html从零开始6:关系选择器、css盒子模型、弹性盒子模型【搬代码】

关系选择器 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,…

Linux日志管理服务 rsyslogd

文章目录 1. 基本介绍2. 系统常用的日志3. 日志管理服务 rsyslogd 1. 基本介绍 日志文件是重要的系统信息文件&#xff0c;其中记录了许多重要的系统事件&#xff0c;包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。日志对于安全来说…

QQ群微信群强制加群/随机小姐姐视频分享打赏裂变PHP源码

很多人再找qq群或者微信分享小姐姐视频打赏的裂变源码&#xff0c;这次就分享出来&#xff01; 下载地址QQ群微信群强制加群.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘

中国电子学会2023年12月份青少年软件编程Scratch图形化等级考试试卷二级真题(含答案)

2023-12 Scratch二级真题 分数&#xff1a;100 题数&#xff1a;37 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1.在制作推箱子游戏时&#xff0c;地图是用数字形式储存在电脑里的&#xff0c;下图是一个推箱子地图&#xff0c;地图表示如下&#x…
最新文章