C#利用接口實(shí)現(xiàn)多語種選擇功能
一、涉及到的知識(shí)點(diǎn)
1.接口定義
接口是一種用來定義程序的協(xié)議,它描述可屬于任何類或結(jié)構(gòu)的一組相關(guān)行為,可以把它看成是實(shí)現(xiàn)一組類的模板。接口可由方法、屬性、事件和索引器或這4種成員類型的任何組合構(gòu)成,但不能包含字段。類和結(jié)構(gòu)可以像類繼承基類一樣從接口繼承,但是可以繼承多個(gè)接口。當(dāng)類或結(jié)構(gòu)繼承接口時(shí),它繼承成員定義但不繼承實(shí)現(xiàn)。若要實(shí)現(xiàn)接口成員,類或結(jié)構(gòu)中的對(duì)應(yīng)成員必須是公共的、非靜態(tài)的,并且與接口成員具有相同的名稱和簽名。類或結(jié)構(gòu)的屬性和索引器可以為接口中定義的屬性或索引器定義額外的訪問器。例如,接口可以聲明一個(gè)帶有g(shù)et訪問器的屬性,而實(shí)現(xiàn)該接口的類可以聲明同時(shí)帶有g(shù)et和set訪問器的同一屬性。但是,如果屬性或索引器使用顯式實(shí)現(xiàn),則訪問器必須匹配。
另外,接口也可以繼承其他接口,類可以通過其繼承的基類或接口多次繼承某個(gè)接口,在這種情況下,如果將該接口聲明為新類的一部分,則類只能實(shí)現(xiàn)該接口一次。如果沒有將繼承的接口聲明為新類的一部分,其實(shí)現(xiàn)將由聲明它的基類提供。基類可以使用虛擬成員實(shí)現(xiàn)接口成員。在這種情況下,繼承接口的類可通過重寫虛擬成員來更改接口行為。
C#中使用interface關(guān)鍵字聲明接口,語法格式如下:
修飾符 interface接口名稱:繼承的接口列表
{
//接口內(nèi)容;
}
說明:
聲明接口時(shí),通常以大寫字母“I”開頭。
聲明接口時(shí),除interface關(guān)鍵字和接口名稱外,其他的都是可選項(xiàng)。
可以使用new、public、protected、internal和private等修飾符聲明接口,但接口成員必須是公共的。
2.接口具有的特征
接口類似于抽象基類,繼承接口的任何非抽象類型都必須實(shí)現(xiàn)接口的所有成員。
不能直接實(shí)例化接口。
接口可以包含事件、索引器、方法和屬性。口 接口不包含方法的實(shí)現(xiàn)。
類和結(jié)構(gòu)可從多個(gè)接口繼承。
接口自身可從多個(gè)接口繼承。
3.接口通過類繼承來實(shí)現(xiàn)
一個(gè)類雖然只能繼承一個(gè)基類,但可以繼承任意多個(gè)接口。聲明實(shí)現(xiàn)接口的類時(shí),需要在基類列表中包含類所實(shí)現(xiàn)的接口的名稱。
C#中實(shí)現(xiàn)繼承的語法格式如下:
class DerivedClass:BaseClass {}
說明:
繼承接口時(shí),必須在子類和接口之間用冒號(hào)(:)。
另外,如果繼承多個(gè)接口,那么在繼承的每個(gè)接口之間用逗號(hào)(,)分隔。
4.有效使用接口進(jìn)行組件編程
接口使得服務(wù)的協(xié)議與實(shí)現(xiàn)相分離,它是組件編程的基礎(chǔ),在組件編程中,接口是組件向外公布其功能的唯一方法。
5.Encoding.GetBytes(String)方法
C# 中的 Encoding.GetBytes(String) 方法用于將指定的字符串轉(zhuǎn)換為字節(jié)數(shù)組。該方法屬于 System.Text.Encoding 類,它提供了用于將字符轉(zhuǎn)換為字節(jié)以及將字節(jié)轉(zhuǎn)換為字符的靜態(tài)方法。
public static byte[] GetBytes(string str);
參數(shù)
str String 包含要編碼的字符的字符串。
返回
Byte[] 一個(gè)字節(jié)數(shù)組,包含對(duì)指定的字符集進(jìn)行編碼的結(jié)果。
在本例中,使用該方法把字符串編碼為UnicodeEncoding序列。
(1)檢查給定字符串中是否包含中文字符
在循環(huán)中,每次迭代都會(huì)檢查當(dāng)前字節(jié)的下一個(gè)字節(jié)(索引 i+1 處的字節(jié))是否不等于 0。因?yàn)樵?Unicode 編碼中,一個(gè)中文字符通常由兩個(gè)字節(jié)表示,所以如果下一個(gè)字節(jié)不等于 0,則表示當(dāng)前字節(jié)表示的是一個(gè)中文字符的一部分。
如果發(fā)現(xiàn)中文字符,將 flag 設(shè)置為 true。否則,將 flag 保持為 false。
循環(huán)結(jié)束后,返回 flag 的值,表示是否在字符串中找到了中文字符。
/// <summary> /// 檢查給定字符串中是否包含中文字符 /// </summary> public static bool IsChineseChecked(string str) { bool flag = false; UnicodeEncoding a = new(); byte[] bt = a.GetBytes(str);//在派生類中重寫時(shí),將指定字符數(shù)組中的所有字符編碼為一個(gè)字節(jié)序列。 for (int i = 0; i < bt.Length; i++) { i++; if (bt[i] != 0) { flag = true; } else { flag = false; } } return flag; }
(2)編碼和還原的前后
編碼的結(jié)果是獲得一序列數(shù)字表達(dá)的字節(jié)數(shù)組。
還原的結(jié)果就是把編碼還原到源字符串。
// 使用 Encoding.UTF8.GetBytes(String) 方法編碼為字節(jié)數(shù)組 // 使用 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)); // 轉(zhuǎn)換回字符串 string backToString = Encoding.UTF8.GetString(bytes); Console.WriteLine("Back to string: " + backToString); Console.WriteLine("********************************"); string str1 = "萬里長(zhǎng)城"; byte[] bytes1 = Encoding.UTF8.GetBytes(str1); Console.WriteLine("源字符串:" + str1); Console.WriteLine("Byte array length: " + bytes1.Length); Console.WriteLine("Byte array: " + string.Join(", ", bytes1)); // 轉(zhuǎn)換回字符串 string backToString1 = Encoding.UTF8.GetString(bytes1); Console.WriteLine("還原到源字符串:" + backToString1); } } } //運(yùn)行結(jié)果: /* 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! ******************************** 源字符串:萬里長(zhǎng)城 Byte array length: 12 Byte array: 228, 184, 135, 233, 135, 140, 233, 149, 191, 229, 159, 142 還原到源字符串:萬里長(zhǎng)城 */
6.Encoding.GetString(Byte[])方法
C# 中的Encoding.GetString(byte[])方法用于將字節(jié)數(shù)組解碼為字符串。它屬于System.Text.Encoding類,該類提供了用于將字符轉(zhuǎn)換為字節(jié)以及將字節(jié)轉(zhuǎn)換為字符的靜態(tài)方法和屬性。
public virtual string GetString (byte[] bytes);
參數(shù)
bytes Byte[] 包含要解碼的字節(jié)序列的字節(jié)數(shù)組。
返回
String 包含指定字節(jié)序列解碼結(jié)果的字符串。
(1)示例
// 使用 Encoding.GetString(byte[]) 方法 using System.Text; namespace _117_2 { internal class Program { private static void Main(string[] args) { ArgumentNullException.ThrowIfNull(args); // 創(chuàng)建一個(gè) Unicode 編碼實(shí)例 Encoding unicodeEncoding = Encoding.UTF8; // 定義一個(gè)字節(jié)數(shù)組,包含一些 Unicode 字符的字節(jié)表示 byte[] bytes = [0x04, 0x41, 0x04, 0x42, 0x04, 0x43]; // 使用 Unicode 編碼將字節(jié)數(shù)組解碼為字符串 string decodedString = unicodeEncoding.GetString(bytes); // 輸出解碼后的字符串 Console.WriteLine(decodedString); } } } //運(yùn)行結(jié)果: /* ABC */
二、實(shí)例
在程序中可以建立一個(gè)接口,該接口定義一個(gè)方法用于對(duì)話,而對(duì)話這個(gè)方法是在類中實(shí)現(xiàn)的。分別創(chuàng)建一個(gè)中國(guó)人的類和一個(gè)美國(guó)人的類,這兩個(gè)類都繼承自接口,在中國(guó)人的類中說漢語,在美國(guó)人的類中說英語,當(dāng)和不同國(guó)家的人交流時(shí),實(shí)例化接口,并調(diào)用相應(yīng)類中的方法即可。
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 = "選擇對(duì)話人:" }; // // button1 // button1 = new Button { Location = new Point(226, 12), Name = "button1", Size = new Size(75, 23), TabIndex = 2, Text = "對(duì)話", 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([ "xxx", "yyy"]); // // 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 = "用接口實(shí)現(xiàn)不同語種談話"; } /// <summary> /// 按鈕事件 /// 選擇通話對(duì)象的語種,并輸入該語種的通話內(nèi)容 /// </summary> private void Button1_Click(object? sender, EventArgs e) { if (textBox1!.Text == "") { MessageBox.Show("不想說點(diǎn)什么嗎?", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { if (comboBox1!.SelectedIndex == 0)//與xxx人對(duì)話 { if (IsChineseChecked(textBox1.Text)) { ISelectLanguage Interface1 = new C_SpeakChinese(); Interface1.Speak(textBox1.Text); } else { MessageBox.Show("和xxx說xx ", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } else//與yyy對(duì)話 { if (IsChineseChecked(textBox1.Text)) { MessageBox.Show("和yyy說yy! ", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { ISelectLanguage Interface1 = new C_SpeakEnglish(); Interface1.Speak(textBox1.Text); } } } } /// <summary> /// 聲明一個(gè)接口,用于定義Seak方法,而具體Speak方法功能的實(shí)現(xiàn)是在類中進(jìn)行的 /// </summary> interface ISelectLanguage { void Speak(string str); } /// <summary> /// 如果跟xxx對(duì)話,則說xx /// </summary> class C_SpeakChinese : ISelectLanguage { public void Speak(string str) { MessageBox.Show("對(duì)xxx說:" + str, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } /// <summary> /// 如果跟yyy對(duì)話,則說yy /// </summary> class C_SpeakEnglish : ISelectLanguage { public void Speak(string str) { MessageBox.Show("對(duì)yyy說:" + str, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } public static bool IsChineseChecked(string str) { bool flag = false; UnicodeEncoding a = new(); byte[] bt = a.GetBytes(str);//在派生類中重寫時(shí),將指定字符數(shù)組中的所有字符編碼為一個(gè)字節(jié)序列。 for (int i = 0; i < bt.Length; i++) { i++; if (bt[i] != 0) { flag = true; } else { flag = false; } } return flag; } } }
以上就是C#利用接口實(shí)現(xiàn)多語種選擇功能的詳細(xì)內(nèi)容,更多關(guān)于C#多語種選擇的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
WPF ProgressBar實(shí)現(xiàn)實(shí)時(shí)進(jìn)度效果
這篇文章主要介紹了WPF ProgressBar實(shí)現(xiàn)實(shí)時(shí)進(jìn)度效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12C# 使用PictureBox實(shí)現(xiàn)圖片按鈕控件的示例步驟
這篇文章主要介紹了C# 使用PictureBox實(shí)現(xiàn)圖片按鈕控件的示例步驟,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-02-02Unity UGUI的ToggleGroup選項(xiàng)組件介紹使用
這篇文章主要為大家介紹了Unity UGUI的ToggleGroup選項(xiàng)組件介紹使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07C#巧用DateTime預(yù)設(shè)可選的日期范圍(如本年度、本季度、本月等)
這篇文章主要介紹了C#巧用DateTime預(yù)設(shè)可選的日期范圍,如本年度、本季度、本月等,感興趣的小伙伴們可以參考一下2016-04-04c# 從內(nèi)存中釋放Selenium chromedriver.exe
這篇文章主要介紹了c# 從內(nèi)存中釋放Selenium chromedriver.exe的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01