目录
一、涉及到的知识点
1、结构
2.结构和类的区别
3.继承
4.使用类继承提高程序的开发效率
二、实例:通过定义结构计算矩形面积
1.源码
2.生成效果
三、实例:通过继承类计算梯形面积
1.源码
2.生成效果
一、涉及到的知识点
1、结构
结构是一种可以包含数据成员和方法成员的值类型数据结构。为结构分配数据时不需要从托管堆中分配内存,结构类型的变量直接包含了该结构的数据。结构中可以包括构造函数、常量、字段、方法、属性、运算符、事件和嵌套类型等,但如果要同时包括上述几种成员,则应该考虑使用类。
使用结构对于小的数据结构特别有用,能够节省大量的分配内存,如复数和坐标系中的点。结构具有以下特点:
- 结构是值类型。
- 向方法传递结构时,是通过传值方式传递的,而不是作为引用传递的。
- 结构的实例化可以不使用new运算符。
- 结构可以声明构造函数,但它们必须带参数。
- 一个结构不能从另一个结构或类继承。所有结构都直接继承自System.ValueType,而System.ValueType继承自System.Object。
- 结构可以实现接口。
- 在结构中初始化实例字段是错误的。
由于结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值来实现默认构造函数。
C#中,使用struct关键字来定义结构,语法格式如下:
【结构修饰符】 struct 【结构名】
{
}
2.结构和类的区别
结构是值类型,它在栈上分配数据,并且结构的赋值将分配产生一个新的对象;
而类是引用类型,它在堆上分配数据,对类的对象进行赋值时只是复制了引用,它们都指向同一个实际对象分配的内存。
3.继承
继承是面向对象编程最重要的特性之一,任何类都可以从另外一个类继承,这就是说,这个类拥有它继承的类的所有成员。在面向对象编程中,被继承的类称为父类或基类。C#中提供了类的继承机制,但只支持单继承,而不支持多重继承,即在C#中一次只允许继承一个类,不能同时继承多个类。
利用类的继承机制,程序开发人员可以在已有类的基础上构造新类,这一性质使得类支持分类的概念。例如,用户可以通过增加、修改或替换类中的方法对这个类进行扩充,以适应不同的应用要求。在日常生活中很多东西都很有条理,那是因为它们有着很好的层次分类,如果不用层次分类,则需要对每个对象都定义其所有的性质。使用继承后,每个对象就可以只定义自己的特殊性质,每一层的对象只需定义本身的性质,其他性质可以从上一层继承下来。
继承一个类时,类成员的可访问性是一个重要的问题。子类(派生类)不能访问基类的私有成员,但是可以访问其公共成员,这就是说,只要使用public声明类成员,就可以让一个类成员被基类和子类(派生类)同时访问,同时也可以被外部的代码访问。
为了解决基类成员访问问题,C#还提供了另外一种可访问性,即protected,只有子类(派生类)才能访问protected成员,基类和外部代码都不能访问protected成员。
除了可以定义成员的保护级别外,还可以为成员定义其继承行为。基类的成员可以是虚拟的,成员可以由继承它的类重写。子类(派生类)可以提供成员的其他执行代码,这种执行代码不会删除原来的代码,仍可以在类中访问原来的代码,但外部代码不能访问它们。如果没有提供其他执行方式,外部代码就直接访问基类中成员的执行代码。
另外,基类还可以定义为抽象类。抽象类不能直接实例化,要使用抽象类就必须继承这个类,然后再实例化。C#中实现继承的语法格式如下:
class DerivedClass:BaseClass {}
说明:继承类时,必须在子类和基类之间使用冒号(:)。
4.使用类继承提高程序的开发效率
类可以从另外一个类继承,也就是说,这个类拥有它继承的类的所有成员(除构造方法外)。利用类的继承机制,程序开发人员可以在已有类的基础上构造新类,从而更快地提高程序的开发效率。
二、实例:通过定义结构计算矩形面积
1.源码
//定义一个结构,然后通过结构计算矩形面积
namespace _112
{
public partial class Form1 : Form
{
private GroupBox? groupBox1;
private TextBox? textBox2;
private TextBox? textBox1;
private Label? label2;
private Label? label1;
private Label? label3;
private TextBox? textBox3;
private Button? button1;
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(16, 30),
Name = "label1",
Size = new Size(32, 17),
TabIndex = 0,
Text = "长:"
};
//
// label2
//
label2 = new Label
{
AutoSize = true,
Location = new Point(16, 57),
Name = "label2",
Size = new Size(32, 17),
TabIndex = 1,
Text = "宽:"
};
//
// textBox1
//
textBox1 = new TextBox
{
Location = new Point(76, 24),
Name = "textBox1",
Size = new Size(100, 23),
TabIndex = 2
};
//
// textBox2
//
textBox2 = new TextBox
{
Location = new Point(76, 51),
Name = "textBox2",
Size = new Size(100, 23),
TabIndex = 3
};
//
// groupBox1
//
groupBox1 = new GroupBox
{
Location = new Point(12, 12),
Name = "groupBox1",
Size = new Size(190, 81),
TabIndex = 0,
TabStop = false,
Text = "矩形参数:"
};
groupBox1.Controls.Add(textBox2);
groupBox1.Controls.Add(textBox1);
groupBox1.Controls.Add(label2);
groupBox1.Controls.Add(label1);
groupBox1.SuspendLayout();
//
// label3
//
label3 = new Label
{
AutoSize = true,
Location = new Point(12, 105),
Name = "label3",
Size = new Size(44, 17),
TabIndex = 4,
Text = "面积:"
};
//
// textBox3
//
textBox3 = new TextBox
{
Location = new Point(67, 99),
Name = "textBox3",
Size = new Size(77, 23),
TabIndex = 5
};
//
// button1
//
button1 = new Button
{
Location = new Point(155, 99),
Name = "button1",
Size = new Size(47, 23),
TabIndex = 6,
Text = "计算",
UseVisualStyleBackColor = true
};
button1.Click += Button1_Click;
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(214, 131);
Controls.Add(button1);
Controls.Add(label3);
Controls.Add(textBox3);
Controls.Add(groupBox1);
Name = "Form1";
Text = "定义结构计算面积";
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
}
/// <summary>
/// 按钮事件
/// </summary>
private void Button1_Click(object? sender, EventArgs e)
{
Rectangle myRectangle = new(Convert.ToDouble(textBox1!.Text), Convert.ToDouble(textBox2!.Text));
textBox3!.Text = myRectangle.RectangleArea().ToString();
}
/// <summary>
/// 使用自定义构造函数实例化矩形结构
/// 构造函数,初始化矩形的宽和高
/// 计算矩形的面积
/// </summary>
/// <param name="x">矩形的宽</param>
/// <param name="y">矩形的高</param>
public struct Rectangle(double x, double y)
{
public double width = x;
public double height = y;
/// <summary>
/// 计算矩形面积
/// </summary>
/// <returns>矩形面积</returns>
public readonly double RectangleArea()
{
return width * height;
}
}
}
}
2.生成效果
三、实例:通过继承类计算梯形面积
1.源码
//通过继承类计算梯形的面积
namespace _113
{
public partial class Form1 : Form
{
private GroupBox? groupBox1;
private TextBox? textBox3;
private TextBox? textBox2;
private TextBox? textBox1;
private Label? label3;
private Label? label2;
private Label? label1;
private Label? label4;
private TextBox? textBox4;
private Button? button1;
public Form1()
{
InitializeComponent();
StartPosition = FormStartPosition.CenterScreen;
Load += Form1_Load;
}
private void Form1_Load(object? sender, EventArgs e)
{
//
// textBox3
//
textBox3 = new TextBox
{
Location = new Point(83, 80),
Name = "textBox3",
Size = new Size(100, 23),
TabIndex = 5
};
//
// textBox2
//
textBox2 = new TextBox
{
Location = new Point(83, 48),
Name = "textBox2",
Size = new Size(100, 23),
TabIndex = 4
};
//
// textBox1
//
textBox1 = new TextBox
{
Location = new Point(83, 16),
Name = "textBox1",
Size = new Size(100, 23),
TabIndex = 3
};
//
// label3
//
label3 = new Label
{
AutoSize = true,
Location = new Point(11, 86),
Name = "label3",
Size = new Size(32, 17),
TabIndex = 2,
Text = "高:"
};
//
// label2
//
label2 = new Label
{
AutoSize = true,
Location = new Point(11, 54),
Name = "label2",
Size = new Size(44, 17),
TabIndex = 1,
Text = "下底:"
};
//
// label1
//
label1 = new Label
{
AutoSize = true,
Location = new Point(11, 22),
Name = "label1",
Size = new Size(44, 17),
TabIndex = 0,
Text = "上底:"
};
//
// groupBox1
//
groupBox1 = new GroupBox
{
Location = new Point(12, 12),
Name = "groupBox1",
Size = new Size(200, 118),
TabIndex = 0,
TabStop = false,
Text = "梯形参数:"
};
groupBox1.Controls.Add(textBox3);
groupBox1.Controls.Add(textBox2);
groupBox1.Controls.Add(textBox1);
groupBox1.Controls.Add(label3);
groupBox1.Controls.Add(label2);
groupBox1.Controls.Add(label1);
groupBox1.SuspendLayout();
//
// label4
//
label4 = new Label
{
AutoSize = true,
Location = new Point(12, 142),
Name = "label4",
Size = new Size(68, 17),
TabIndex = 1,
Text = "梯形面积:"
};
//
// textBox4
//
textBox4 = new TextBox
{
Location = new Point(77, 136),
Name = "textBox4",
Size = new Size(70, 23),
TabIndex = 2
};
//
// button1
//
button1 = new Button
{
Location = new Point(168, 136),
Name = "button1",
Size = new Size(44, 23),
TabIndex = 3,
Text = "计算",
UseVisualStyleBackColor = true
};
button1.Click += Button1_Click;
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(224, 166);
Controls.Add(button1);
Controls.Add(textBox4);
Controls.Add(label4);
Controls.Add(groupBox1);
Name = "Form1";
Text = "通过继承计算面积";
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
}
/// <summary>
/// 按钮事件:实例化类对象
/// 计算梯形面积
/// </summary>
private void Button1_Click(object? sender, EventArgs e)
{
TrapeziaArea myTrapezoid = new()
{
SD = Convert.ToDouble(textBox1!.Text),
XD = Convert.ToDouble(textBox2!.Text),
Height = Convert.ToDouble(textBox3!.Text)
};
textBox4!.Text = myTrapezoid.Area().ToString();
}
}
/// <summary>
/// 自定义Trapezia类
/// </summary>
class Trapezia//
{
private double sd = 0; //定义int型变量,作为梯形的上底
private double xd = 0; //定义int型变量,作为梯形的下底
private double height = 0;//定义int型变量,作为梯形的高
/// <summary>
/// 上底
/// </summary>
public double SD
{
get
{
return sd;
}
set
{
sd = value;
}
}
/// <summary>
/// 下底
/// </summary>
public double XD
{
get
{
return xd;
}
set
{
xd = value;
}
}
/// <summary>
/// 高
/// </summary>
public double Height
{
get
{
return height;
}
set
{
height = value;
}
}
}
/// <summary>
/// 自定义类,该类继承自Trapezia
/// </summary>
class TrapeziaArea : Trapezia
{
/// <summary>
/// 求梯形的面积
/// </summary>
/// <returns>梯形的面积</returns>
public double Area()
{
return (SD + XD) * Height / 2;
}
}
}
2.生成效果