目录
一、涉及到的知识点1
1.虚方法
2.重写方法
3.重写方法与重载方法的区别
4.通过KeyPressEventArgs.KeyChar限制键盘输入的内容
5.if-else if-else嵌套转换为switch case
二、 涉及到的知识点2
1.多态性
2.使用多态性的注意事项
3. 使用虚方法实现多态性
三、实例1:重写虚方法
1.源码
2.生成效果
四、实例2:多态性
1.源码
2.生成效果
一、涉及到的知识点1
1.虚方法
通过virtual关键字修饰的方法被称为虚方法,虚方法可以被其子类重写。
虚方法就是允许被其子类重新定义的方法,在声明时,需要使用virtual修饰符。
virtual修饰符不能与static、abstract或者override修饰符同时使用。
由于虚方法不能是私有的,所以virtual修饰符不能与private修饰符同时使用。
2.重写方法
如果一个方法声明中含有override修饰符,则称该方法为重写方法,它主要用来使用相同的签名重写继承的虚方法。虚方法主要用来引入新方法,而重写方法则使从基类继承而来的虚方法专用化(提供虚方法的具体实现)。
override修饰符不能与new、static或者virtual修饰符同时使用。另外,重写方法只能用于重写基类中的虚方法,不能用来单独声明方法。
3.重写方法与重载方法的区别
重写方法与重载方法是不相同的,重写方法是指在派生类中重写基类的虚方法;而重载方法是指编写一个与已有方法同名,但参数列表不同的方法。
4.通过KeyPressEventArgs.KeyChar限制键盘输入的内容
在C#中,KeyPressEventArgs.KeyChar是与KeyPress事件相关联的事件参数类KeyPressEventArgs的一个属性。它提供有关事件的按键信息。
KeyPressEventArgs.KeyChar属性返回一个char值,表示按下的键的字符。如果按下的键不生成字符(例如功能键或箭头键),则该属性将返回一个空字符(‘\0’)。
本例中,通过KeyPressEventArgs.KeyChar属性对键盘输入进行判断是否‘0~9’、是否回车、是否回退键。
/// <summary>
/// 这段代码是一个事件处理程序,用于处理 TextBox1 控件的 KeyPress 事件。
/// 它确保用户在 TextBox1 中输入的字符
/// 仅限于数字(0-9)和回车键(\r)以及退格键(\b)。
/// </summary>
private void TextBox1_KeyPress(object? sender, KeyPressEventArgs e)
{
if (!(e.KeyChar <= '9' && e.KeyChar >= '0') && e.KeyChar != '\r' && e.KeyChar != '\b')
{
e.Handled = true;
}
}
5.if-else if-else嵌套转换为switch case
转换后,程序更易读和简练。
详见实例中的源码。
二、 涉及到的知识点2
1.多态性
多态性可以简单地概括为“一个接口,多种方法”,它是在程序运行的过程中才决定调用的方法,多态性是面向对象编程的核心概念。
多态使得子类(派生类)的实例可以直接赋予基类的对象(这里不需要进行强制类型转换),然后直接就可以通过这个对象调用子类(派生类)的方法。
2.使用多态性的注意事项
多态性主要是用于实现接口重用,因为接口是程序开发中最耗费时间的资源,实质上设计一个接口要比设计一堆类要显得更有效率。
多态性在C#中主要通过虚方法和重写方法来体现。
3. 使用虚方法实现多态性
首先在基类中定义虚方法,每一个子类都重写基类的虚方法,采用基类的对象引用子类实例的方法创建对象,这样会产生很多基类的对象,使用每一个基类的对象调用虚方法时会调用不同子类重写基类的方法,这样就实现了多态性。
三、实例1:重写虚方法
本实例将通过重写虚方法实现两个数相加,具体实现时,首先在Operation类中定义一个虚方法Operators,用于实现两个数相乘;然后创建一个子类Addition,继承自Operation类,在子类中重写虚方法Operators,实现两个数相加。依此类推。
1.源码
// 重写虚方法实现+-*/运算
namespace _119
{
public partial class Form1 : Form
{
private TextBox? textBox1;
private ComboBox? comboBox1;
private TextBox? textBox2;
private Label? label1;
private TextBox? textBox3;
private Button? button1;
public Form1()
{
InitializeComponent();
StartPosition = FormStartPosition.CenterScreen;
Load += Form1_Load;
}
private void Form1_Load(object? sender, EventArgs e)
{
//
// textBox1
//
textBox1 = new TextBox
{
Location = new Point(12, 20),
Name = "textBox1",
Size = new Size(50, 23),
TabIndex = 0
};
textBox1.KeyPress += TextBox1_KeyPress;
//
// comboBox1
//
comboBox1 = new ComboBox
{
FormattingEnabled = true,
Location = new Point(68, 18),
Name = "comboBox1",
Size = new Size(43, 25),
TabIndex = 1
};
comboBox1.Items.AddRange([
"×",
"+",
"-",
"/"
]);
//
// textBox2
//
textBox2 = new TextBox
{
Location = new Point(117, 20),
Name = "textBox2",
Size = new Size(50, 23),
TabIndex = 2
};
textBox2.KeyPress += TextBox2_KeyPress;
//
// label1
//
label1 = new Label
{
AutoSize = true,
Location = new Point(173, 26),
Name = "label1",
Size = new Size(17, 17),
TabIndex = 3,
Text = "="
};
//
// textBox3
//
textBox3 = new TextBox
{
Location = new Point(196, 20),
Name = "textBox3",
Size = new Size(76, 23),
TabIndex = 4
};
//
// button1
//
button1 = new Button
{
Location = new Point(220, 56),
Name = "button1",
Size = new Size(52, 23),
TabIndex = 5,
Text = "计算",
UseVisualStyleBackColor = true
};
button1.Click += Button1_Click;
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(284, 91);
Controls.Add(button1);
Controls.Add(textBox3);
Controls.Add(label1);
Controls.Add(textBox2);
Controls.Add(comboBox1);
Controls.Add(textBox1);
Name = "Form1";
Text = "重写虚方法实现加法";
}
private void Button1_Click(object? sender, EventArgs e)
{
if (textBox1!.Text == "" || textBox2!.Text == "")
{
MessageBox.Show("请输入数字", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
//else
//{
// if (comboBox1!.SelectedIndex == 0)
// {
// Operation multiplication = new();//原始虚方法进行乘法运算
// textBox3!.Text = multiplication.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();
// }
// else if (comboBox1!.SelectedIndex == 1)
// {
// Operation addition = new Addition();
// textBox3!.Text = addition.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();
// }
// else if (comboBox1!.SelectedIndex == 2)
// {
// Operation minus = new Minus();
// textBox3!.Text = minus.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();
// }
// else
// {
// Operation division = new Division();
// textBox3!.Text = division.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();
// }
//}
// 转换为Switch语句
else
{
switch (comboBox1!.SelectedIndex)
{
case 0:
{
Operation multiplication = new();//原始虚方法进行乘法运算
textBox3!.Text = multiplication.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();
break;
}
case 1:
{
Operation addition = new Addition();
textBox3!.Text = addition.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();
break;
}
case 2:
{
Operation minus = new Minus();
textBox3!.Text = minus.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();
break;
}
default:
{
Operation division = new Division();
textBox3!.Text = division.Operators(Convert.ToInt32(textBox1.Text.Trim()), Convert.ToInt32(textBox2.Text.Trim())).ToString();
break;
}
}
}
}
/// <summary>
/// 这段代码是一个事件处理程序,用于处理 TextBox1 控件的 KeyPress 事件。
/// 它确保用户在 TextBox1 中输入的字符
/// 仅限于数字(0-9)和回车键(\r)以及退格键(\b)。
/// </summary>
private void TextBox1_KeyPress(object? sender, KeyPressEventArgs e)
{
if (!(e.KeyChar <= '9' && e.KeyChar >= '0') && e.KeyChar != '\r' && e.KeyChar != '\b')
{
e.Handled = true;
}
}
/// <summary>
/// 这段代码是一个事件处理程序,用于处理 TextBox1 控件的 KeyPress 事件。
/// 它确保用户在 TextBox1 中输入的字符
/// 仅限于数字(0-9)和回车键(\r)以及退格键(\b)。
/// </summary>
private void TextBox2_KeyPress(object? sender, KeyPressEventArgs e)
{
if (!(e.KeyChar <= '9' && e.KeyChar >= '0') && e.KeyChar != '\r' && e.KeyChar != '\b')
{
e.Handled = true;
}
}
/// <summary>
/// 建立的虚方法,可以在子类中被重写
/// </summary>
class Operation
{
public virtual double Operators(int x, int y)
{
return x * y;
}
}
/// <summary>
/// 在子类中重写虚方法,改写为加法
/// </summary>
class Addition : Operation
{
public override double Operators(int x, int y)
{
return (x + y);
}
}
/// <summary>
/// 依次在子类中重写虚方法,改写为减法
/// </summary>
class Minus : Operation
{
public override double Operators(int x, int y)
{
return (x - y);
}
}
/// <summary>
/// 依次在子类中重写虚方法,改写为除法
/// </summary>
class Division : Operation
{
public override double Operators(int x, int y)
{
return (float)x / y;
}
}
}
}
2.生成效果
四、实例2:多态性
日常生活中经常说的开电视、开电脑、开音箱等,这里的“开”其实就是多态。
本实例通过使用类的多态性来确定人类的说话行为。运行本实例,首先在文本框中输入人的姓名,然后单击“确定”按钮,在RichTextBox控件中分别显示人的“说汉语”和“说英语”行为。
1.源码
// 通过类的多态性确定人类的说话行为
namespace _120
{
public partial class Form1 : Form
{
private Label? label1;
private TextBox? textBox1;
private Button? button1;
private RichTextBox? richTextBox1;
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, 14),
Name = "label1",
Size = new Size(68, 17),
TabIndex = 0,
Text = "输入姓名:"
};
//
// textBox1
//
textBox1 = new TextBox
{
Location = new Point(86, 8),
Name = "textBox1",
Size = new Size(125, 23),
TabIndex = 1
};
//
// button1
//
button1 = new Button
{
Location = new Point(217, 8),
Name = "button1",
Size = new Size(75, 23),
TabIndex = 2,
Text = "确定",
UseVisualStyleBackColor = true
};
button1.Click += Button1_Click;
//
// richTextBox1
//
richTextBox1 = new RichTextBox
{
Location = new Point(12, 42),
Name = "richTextBox1",
Size = new Size(280, 72),
TabIndex = 3,
Text = ""
};
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(304, 126);
Controls.Add(richTextBox1);
Controls.Add(button1);
Controls.Add(textBox1);
Controls.Add(label1);
Name = "Form1";
Text = "类的多态性确定说话行为";
}
private void Button1_Click(object? sender, EventArgs e)
{
if (textBox1!.Text == "")
{
Console.WriteLine("请输入姓名:");
return;
}
richTextBox1!.Clear();
string strName = textBox1.Text;
People[] people =
[
new Chinese(), //使用第一个派生类对象初始化数组的第一个元素
new American(), //使用第二个派生类对象初始化数组的第二个元素
]; //声明People类型数组
for (int i = 0; i < people.Length; i++) //遍历赋值后的数组
{
people[i].Say(richTextBox1, strName); //根据数组元素调用相应派生类中的重写方法
}
}
}
/// <summary>
/// 定义基类
/// 定义虚方法,表示人的说话行为
/// </summary>
class People
{
public virtual void Say(RichTextBox rtbox, string name)
{
rtbox.Text += name;
}
}
/// <summary>
/// 定义派生类,继承于基类
/// 重写基类中的虚方法
/// </summary>
class Chinese : People
{
public override void Say(RichTextBox rtbox, string name)
{
base.Say(rtbox, name + "说汉语!\n");
}
}
/// <summary>
/// 定义派生类,继承于基类
/// 再次重写基类中的虚方法
/// </summary>
class American : People
{
public override void Say(RichTextBox rtbox, string name)
{
base.Say(rtbox, name + "说英语!");
}
}
}