结构和类
本博客介绍C#的两个重要的概念:结构和类。结构是从高过程化程序设计中保存留下来的一种数据类型,而类则是面向对象程序中的最基本,也是最重要的一个概念。
@TOCsad
1.1结构
1.1.1结构概述
结构是一种值类型,通常用来封装一组相关的变量,结构中可以包括构造函数,常量,字段,方法,属性,运算符。但如果要同时包括上述几种成员,那么应该考虑是用来类。
一个结构不能从另一个结构或类继承,所有的结构都直接继承System.ValueType.后者继承来自System.Object.
在结构声明中,除非字段被声明为const或static,否则无法初始化
C#中使用struct关键字来声明结构
结构的实例化可以不适用new关键字
结构修饰符 struct 结构名
{
}
例题
下面声明一个矩形结构,该结构中定义了矩形的宽和高,在该结构中定义一个构造函数,两个参数用来初始化举行的宽和高,并自定义了一个Area()方法,来计算矩形的面积。在Main()方法中实例化矩形的一个对象,并通过调用结构中的自定义方法计算矩形的面积,最后使用矩形结构的构造函数再次实例化矩形结构的一个对象来计算矩形的面积;
using System;
namespace Pizrim
{
public struct Rect
{
public double width;
public double height;
public Rect(double x, double y)
{
width = x;
height = y;
}
public double Area()
{
return width * height;
}
}
class sb
{
static void Main()
{
Rect rect1;//实例化矩形结构
rect1.width = 5;
rect1.height = 3;
Console.WriteLine("矩形面积为: " + rect1.Area());
Rect rect2 = new Rect(6, 4);
Console.WriteLine("矩形面积为: " + rect2.Area());
}
}
}
1.2面向对象概述
1.2.1对象
对象=算法+数据结构
程序=对象+对象+对象…
从上述的等式可以看出,程序就是许多对象在计算机中相继表现自己,而对象则是一个个程序实体!
下面,我们用面向对象程序设计思想要以对象来思考问题,首先要将显示世界的实体抽象为对象,然后考虑这个对象具备的属性和行为。
例如,现在面临一只大雁要从北方飞往南方这样一个实际问题,那我们就用面向对象的思想来解决这一实际问题
1 首先识别出这个对象的属性。这里抽象出的对象为大雁
2 然后识别这个对象的属性。对象具备的属性都应该是静态属性,如大雁有一对翅膀,黑色的羽毛等
3 接识别这个对象的动态行为,即这只大雁可以进行的动作,如觅食,飞行等,这些行为都是因为这个对象基于其属性而具有的动作
4 识别出这些对象的属性和行为后,这个对象就被定义完成,然后可以根据这只大雁具有的特点指定这只大雁从北方飞向南方的具体方案以解决问题
实质上究其本质,所有大雁都具有以上的属性和行为,可以将这些属性和行为封装起来以藐视大雁这类动物。由此可见,类实质上就是封装对象属性和行为的载体,而对象则是类抽象出来的一个实例
1.2.2 类
类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实体被称为类,例如,一个鸟类。鸟类封装了所有鸟的共同属性和应具有的行为。
定义完成鸟类后,可以根据这个类抽象出一个实体对象,最后通过实体对象来解决相关的实际问题。
1.2.3 封装
面向对象程序设计有一下特点
1 封装性
2 继承性
3 多态性
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。就例如上面我写的那只鸟,假如我们想让鸟去飞翔,告诉鸟飞翔就可,根本不必说告诉鸟挥动翅膀,计算机也是如此。
采用封装的思想保证了类内部数据结构的完整性,应用该类的用户不能轻易直接操作此数据结构,而只能执行类允许公开的数据。这样就避免了外部对内部数据的影响,提高了程序的可维护性。
例题
创建一个控制台应用程序,其中自定义了一个MyClass类,该类用来封装加数和被加数的属性;然后自定义一个Add()方法,该方法用来返回该类中两个int属性的和;Program主程序类中,实例化自定义类的对象,并在MyClass类中的两个属性赋值,最后调用MyClass类中的自定义方法Add()返回两个属性的和
using System;
namespace ConsoleApplication7
{
class MyClass
{
private int x = 0;
private int y = 0;
public int X
{
get
{
return x;
}
set
{
x = value;
}
}
public int Y
{
get
{
return y;
}
set
{
y = value;
}
}
public int Add()
{
return X + Y;
}
}
class Program
{
static void Main()
{
MyClass myclass = new MyClass();
myclass.X = 3;
myclass.Y = 5;
Console.WriteLine(myclass.Add());
}
}
}
1.2.4 继承
如果说遇到同样问题要来重复使用的话,假如说用来解决信鸽送信的问题,我们很自然的能想到信鸽是鸟类,鸽子具有和鸟类相同的属性和行为。便可以在创建信鸽类时将鸟类拿来使用,并且保留鸟类具有的属性和行为。不过,不是所有的鸟类都有送信的习惯,因 此还需要添加一些信鸽具有的独特属性和行为。这就是继承的核心思想:继承性主要利用特定属性之间的共有属性。
在C#中使用:来标识两个类的继承关系
例如,以1.2.3的例题为例
如果我们想要创建一个新类来继承MyClass
class MyClass2:MyClass
{
//然后在这里面继续
}
继承并不只是扩展父类的功能,话可以重写父类的成员方法。重写就是在子类中将父类的成员方法的名称保留,重写成员方法的内容实现,更改成员方法的储存权限,或是修改成员方法 的返回值类型;
当重写父类时,修改方法的修饰权限只能由小到大
从public到private就是错误的重写!
1.2.5 多态
了解多态,就得了解抽象类和接口
抽象类
我们以绘制图形为例。作为所有图形的父物体图形类,它有绘制图形的能能力,这个方法可以称为绘制图形,但是,如果我们让他绘制一个图形,没有一个人知道应该画什么图形出来,如果要从图形类中抽象出一个图形对象,没有人能说清这个图形究竟是什么图形,所以用抽象这个词汇形容比较合适,在C#中这样的类就被称为抽象类!!!
n接口
由抽象的方法组成的集合就是接口。例如,我们从不同的五金店买来了螺丝帽和螺丝钉,然而这个螺丝钉可以轻松的宁在螺丝帽上,虽然螺丝帽和螺丝钉的生产厂家可能不同,但这两个物体可以轻松的组合在一起,这是因为不同的生成厂家遵循同样的生产原则,这样的生产原则在c#里就被称为接口!
1.3类
1.3.1 类的声明
在c#中饭,类是使用clas关键字声明的,语法如下
类修饰符 class 类名
{
}
例题
下面以汽车声明一个类,代码如下
public class car
{
public int number;
public string color;
private string brand;
}
1.3.2构造函数和解析函数
一般来说,对象的生命周期从构造函数开始,以解析函数结束
如果一个类含有构造函数,在实例化该类的对象时就会调用,如果含有析构函数,则会在销毁对象时调用。
构造函数和析构函数是类中比较特殊的两种成员函数,分别用来对对象进行初始化和回收对象资源。
构造函数—————对象初始化!!!
析构函数—————回收对象资源!!
1.3.2.1 构造函数
构造函数具有与类相同的名称,它通常初始化新对象的数据成员。
构造函数主要用来在创建对象时初始化对象 即为对象成员变量赋初始值
通俗点讲就是对象出生时候有什么特征,长得是什么摸样,有什么本领
例题
在Program类中定义3个int类型的变量,分别用来表示加数,被加数,和加法的和,然后声明Program类的一个构造函数,并在该构造函数中为加法的和赋值,然后在Main()方法中实例化Program类的对象,并输出加法的和
class Program
{
public int x= 3;
public int y =5;
public int z=0;
public Program()
{
z = x + y;
}
static void Main()
{
Program program= new Program();
Console.WriteLine("结果: "+program.z);
}
}
不带参数的构造函数称为“默认构造函数”。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认的构造函数。
1.3.2.2 析构函数
析构函数是以类名“~”来命名的。
析构函数是由垃圾回收器控制的.把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这样就不用担心忘记对象的初始化和清除工作
对象的创建及使用
对象可以操作类的属性和方法解决相应的问题,所以理解对像的产生,操作和消亡对学C#是非常重要的
1.3.4.1对象的创建
在构造函数中介绍过实例化一个对象就会自动调用一次构造函数,实质上这个过程就是创建对象的过程
语法如下:
Test test = new Test();
Test test = new Test("a");
语法表
Test 类名
test 创建Test类对象
new 创建对象操作符
“a” 构造函数的参数
这些在前面的类中都有所体现,这里就不进行讲解
1.3.4.2 this 关键字
记得在本人实验室考核时,考核的人指着this 我却说不下了,这里对this进行一个讲解
在项目中创建一个类文件,该类中定义了setName()方法,并将该放大的参数值赋给类中的成员变量。
private void setName(String name)//定义一个setName()方法
{
this.name = name;//将参数值赋予给类中的成员变量
}
在上述代码中可以看到,成员变量与在setName()方法中的形式参数的名称相同,都为name,那么如何区分类中使用的时哪一个变量?
c#中规定使用this关键字来代表本类对象的引用,this关键字被隐式的用于对象的成员变量和方法
既然this关键字和对象都可以调用成员变量和成员方法,那么this关键字与对象之间具有怎样的关系呢?
事实上,this引用的就是本类中的一个对象,在局部变量或方法参数覆盖了成员变量本身而已,成员变量name的值没有改变,因为参数name在方法中的作用域覆盖给了成员变量name。