C#利用接口實現(xiàn)多語種選擇功能
一、涉及到的知識點(diǎn)
1.接口定義
接口是一種用來定義程序的協(xié)議,它描述可屬于任何類或結(jié)構(gòu)的一組相關(guān)行為,可以把它看成是實現(xiàn)一組類的模板。接口可由方法、屬性、事件和索引器或這4種成員類型的任何組合構(gòu)成,但不能包含字段。類和結(jié)構(gòu)可以像類繼承基類一樣從接口繼承,但是可以繼承多個接口。當(dāng)類或結(jié)構(gòu)繼承接口時,它繼承成員定義但不繼承實現(xiàn)。若要實現(xiàn)接口成員,類或結(jié)構(gòu)中的對應(yīng)成員必須是公共的、非靜態(tài)的,并且與接口成員具有相同的名稱和簽名。類或結(jié)構(gòu)的屬性和索引器可以為接口中定義的屬性或索引器定義額外的訪問器。例如,接口可以聲明一個帶有g(shù)et訪問器的屬性,而實現(xiàn)該接口的類可以聲明同時帶有g(shù)et和set訪問器的同一屬性。但是,如果屬性或索引器使用顯式實現(xiàn),則訪問器必須匹配。
另外,接口也可以繼承其他接口,類可以通過其繼承的基類或接口多次繼承某個接口,在這種情況下,如果將該接口聲明為新類的一部分,則類只能實現(xiàn)該接口一次。如果沒有將繼承的接口聲明為新類的一部分,其實現(xiàn)將由聲明它的基類提供?;惪梢允褂锰摂M成員實現(xiàn)接口成員。在這種情況下,繼承接口的類可通過重寫虛擬成員來更改接口行為。
C#中使用interface關(guān)鍵字聲明接口,語法格式如下:
修飾符 interface接口名稱:繼承的接口列表
{
//接口內(nèi)容;
}
說明:
聲明接口時,通常以大寫字母“I”開頭。
聲明接口時,除interface關(guān)鍵字和接口名稱外,其他的都是可選項。
可以使用new、public、protected、internal和private等修飾符聲明接口,但接口成員必須是公共的。
2.接口具有的特征
接口類似于抽象基類,繼承接口的任何非抽象類型都必須實現(xiàn)接口的所有成員。
不能直接實例化接口。
接口可以包含事件、索引器、方法和屬性。口 接口不包含方法的實現(xiàn)。
類和結(jié)構(gòu)可從多個接口繼承。
接口自身可從多個接口繼承。
3.接口通過類繼承來實現(xiàn)
一個類雖然只能繼承一個基類,但可以繼承任意多個接口。聲明實現(xiàn)接口的類時,需要在基類列表中包含類所實現(xiàn)的接口的名稱。
C#中實現(xiàn)繼承的語法格式如下:
class DerivedClass:BaseClass {}
說明:
繼承接口時,必須在子類和接口之間用冒號(:)。
另外,如果繼承多個接口,那么在繼承的每個接口之間用逗號(,)分隔。
4.有效使用接口進(jìn)行組件編程
接口使得服務(wù)的協(xié)議與實現(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[] 一個字節(jié)數(shù)組,包含對指定的字符集進(jìn)行編碼的結(jié)果。
在本例中,使用該方法把字符串編碼為UnicodeEncoding序列。
(1)檢查給定字符串中是否包含中文字符
在循環(huán)中,每次迭代都會檢查當(dāng)前字節(jié)的下一個字節(jié)(索引 i+1 處的字節(jié))是否不等于 0。因為在 Unicode 編碼中,一個中文字符通常由兩個字節(jié)表示,所以如果下一個字節(jié)不等于 0,則表示當(dāng)前字節(jié)表示的是一個中文字符的一部分。
如果發(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ù)組中的所有字符編碼為一個字節(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 = "萬里長城";
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!
********************************
源字符串:萬里長城
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[])方法用于將字節(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)建一個 Unicode 編碼實例
Encoding unicodeEncoding = Encoding.UTF8;
// 定義一個字節(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
*/二、實例
在程序中可以建立一個接口,該接口定義一個方法用于對話,而對話這個方法是在類中實現(xiàn)的。分別創(chuàng)建一個中國人的類和一個美國人的類,這兩個類都繼承自接口,在中國人的類中說漢語,在美國人的類中說英語,當(dāng)和不同國家的人交流時,實例化接口,并調(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 = "選擇對話人:"
};
//
// 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([
"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 = "用接口實現(xiàn)不同語種談話";
}
/// <summary>
/// 按鈕事件
/// 選擇通話對象的語種,并輸入該語種的通話內(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人對話
{
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對話
{
if (IsChineseChecked(textBox1.Text))
{
MessageBox.Show("和yyy說yy! ", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
ISelectLanguage Interface1 = new C_SpeakEnglish();
Interface1.Speak(textBox1.Text);
}
}
}
}
/// <summary>
/// 聲明一個接口,用于定義Seak方法,而具體Speak方法功能的實現(xiàn)是在類中進(jìn)行的
/// </summary>
interface ISelectLanguage
{
void Speak(string str);
}
/// <summary>
/// 如果跟xxx對話,則說xx
/// </summary>
class C_SpeakChinese : ISelectLanguage
{
public void Speak(string str)
{
MessageBox.Show("對xxx說:" + str, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
/// <summary>
/// 如果跟yyy對話,則說yy
/// </summary>
class C_SpeakEnglish : ISelectLanguage
{
public void Speak(string str)
{
MessageBox.Show("對yyy說:" + str, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
public static bool IsChineseChecked(string str)
{
bool flag = false;
UnicodeEncoding a = new();
byte[] bt = a.GetBytes(str);//在派生類中重寫時,將指定字符數(shù)組中的所有字符編碼為一個字節(jié)序列。
for (int i = 0; i < bt.Length; i++)
{
i++;
if (bt[i] != 0)
{
flag = true;
}
else
{
flag = false;
}
}
return flag;
}
}
}以上就是C#利用接口實現(xiàn)多語種選擇功能的詳細(xì)內(nèi)容,更多關(guān)于C#多語種選擇的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#實現(xiàn)獲取系統(tǒng)目錄并以Tree樹叉顯示的方法
這篇文章主要介紹了C#實現(xiàn)獲取系統(tǒng)目錄并以Tree樹叉顯示的方法,可以加深讀者對于C#下數(shù)據(jù)結(jié)構(gòu)實現(xiàn)方法的認(rèn)識,需要的朋友可以參考下2014-07-07
C#實現(xiàn)統(tǒng)計100以內(nèi)所有素數(shù)的個數(shù)
這篇文章介紹了C#實現(xiàn)統(tǒng)計100以內(nèi)所有素數(shù)個數(shù)的方法,文中注釋非常詳細(xì),很適合新手學(xué)習(xí)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11
C#創(chuàng)建安全的字典(Dictionary)存儲結(jié)構(gòu)
本文主要對存儲結(jié)構(gòu)字典(Dictionary)的一些常用方法進(jìn)行簡單的說明,并闡述了如何創(chuàng)建安全的字典(Dictionary)存儲結(jié)構(gòu)。希望對大家有所幫助2016-12-12

