9.1面向对象的编程思想
一、概述:
对象:问题空间的元素及其在解空间中的表示
实质:通过添加新类型的对象,使自身适用于某个特定的问题
面向对象方式是一种更加灵活,更有力的语言抽象,根据问题来描述问题
基本特性:
1.万物皆为对象
2.程序是对象的集合,通过发送消息告诉彼此要做的
3.每个对象都有自己的有其他对象所构成的存储
4.每个对象都有其类型(每个对象都是某个类的实例)
5.某个特定类型的所有对象都可以接受同样的消息
对象具有状态、行为和标识,拥有内部数据(状态)和方法(行为),每个对象都在内存中有唯一的地址
9.2从特殊到一般——C#中的类
1.类的定义:
类是对具有相同特征的事物的抽象,其中包含的具体的个体叫做对象
语法结构:
[访问修饰符] class 类名
{
类的主体
}
其中,修饰符可以为public、protected、internal、private和protected internal等,访问修饰符可以省略,区别如下:
1.public:
对类的访问不受限制,类似于公共图书馆
2.protected:
对类的访问仅限于包含类或从包含类派生的类,就像单位的图书馆
3.private:
访问仅限于包含类,如私人图书馆
4.internal:
访问仅限于当前项目
5.protected internal:
同时拥有protected和internal的访问权
2.类的成员:
分类:
1.描述状态的数据成员
2.描述操作的函数成员
数据成员:
类的数据成员包括字段,常量和事件,字段就是在类中定义的变量,常量是类的常量成员
数据成员定义语法:
[访问修饰符] 数据类型 成员变量名
实例:
public class test
{
protected int name;
}
属性成员:
属性是字段的扩展,是一个与类或对象相关联的命名,拥有访问器,定义了读取或写入属性值时必须执行的代码,通过get{}和set{}访问器实现对类中私有字段的读/写操作
语法格式:
[访问修饰符] 数据类型 属性名
public string testName
{
get{return testName;}
set{testName=value;}
}
方法成员:
描述对象的行为,执行操作数据等行为
语法格式:
[访问修饰符] 返回值数据类型 方法名(参数列表)
{
方法体
}
静态成员:
静态成员是与类相关的,不依赖于特定的对象,可以直接使用,无需创建对象,直接使用,声明时使用static关键字,例如:
public static void Print();
{
Console.WriteLine("This is a test");
}
9.3从一般到特殊——C#中的对象
一、概述:
对象是类的实例,对象是类的个体,创建对象是从抽象到具体的过程,是将类的属性和行为实例化的过程
二、具体讲解:
对象的创建和使用:
语法格式:
类名 对象名 = new 类名(参数列表)
//参数列表是可选的
对象的使用时通过访问对象中的非静态成员实现的
语法格式:
对象名.成员名
匿名类型和对象初始化器:
可以实现在创建对象的同时实现对象的初始化
语法格式:
Test testLabel = new Test() { testContent = "Hello,World" }
如果没有定义类,却需要使用该类的对象,可以使用对象初始化器,而不需要指定类名,如:
var l = new { x = 0, y = 0 };
构造函数:
构造函数是类的特殊方法成员,其名称和类名相同,主要用来完成对象的初始化,使用new语句创建对象的过程实际上就是在调用类的构造函数,创建对象时使用构造函数对对象初始化,如果没有定义构造函数,系统则会使用默认的构造函数,访问一个类时,会优先执行构造函数中的语句
析构函数:
析构函数时对象销毁前释放所占用的系统资源的类的成员,其名字是在类名前面加上~,无参数,无返回值
应用举例:
class Test
{
public string testContent
{
get{ return testContent;}
set{ testContent = value;}
}
public Test()
{
testContent="Hello,World";
}
public Test(string Content)
{
testContent=Content;
}
~Test()
{
Console.WriteLine("用于清理资源");
}
}
注意:
静态构造函数用于初始化静态字段成员,举例:
public static string Content;
static Test()
{
Content="Hello,World";
}
参数传递:
定义方法时声明的参数时形式参数,传递的值是实在参数,传递参数类型分为值传递和引用传递
值传递:
系统默认的参数传递方式,传递的值是一个副本,对实在参数无影响
引用传递:
把实在参数的地址赋予形式参数,二者指向同一个内存单元
举例:
private void Swap(ref num1, ref num2)
{
//语句块
}
testContent.Swap(ref num1, ref num2);
注意:
使用ref传递时,无论定义还是调用都要使用ref关键字,引用传递还可使用out关键字,二者区别在于ref关键字要求参数在传递前必须初始化,而out无要求
拓展:
out传递参数尽管不需要初始化,但是要求在方法返回前对其传递的参数赋值,换而言之,out类型参数传递提供了一种让方法返回多个值的方式
9.4结构与类
一、概述:
结构可以看作轻量的类,封装小型的相关变量组
二、具体讲解:
结构的定义和使用:
使用struct关键字,成员可以是常量,变量,构造函数,方法和属性等
语法结构:
<访问修饰符> struct 结构名
{
结构体定义;
}
注意:
结构中只能定义含有参数的构造函数,对于数据字段不能赋值,否则出错
结构和类的区别:
1.结构是值类型,类是引用类型
2.结构的构造函数和类的和构造函数不同,结构不能使用无参数的构造函数,结构成员会自动初始化其默认值
3.结构中的实例字段成员,不能在声明时初始化
4.声明了结构类型后,可以使用new运算符创建对象,也可以不使用new,但对象在初始化前不可用
5.结构不支持继承
9.5分布类
一、概述:
某些情况下,一个类、结构或者接口需要放在几个文件中处理,编译时再将其组合成一个完整的类
适用情况:
1.类型特别大,不适宜放在一个文件中
2.一个类型中的部分代码是自动化工具生成的代码,不宜与自己的代码混在一起
3.需要多个人编写一个类
注意:
分布类只是一个语言层面的编译处理,处理分布类由编译器完成,不影响最后代码的执行
二、具体讲解:
C#分布类的定义是在class的前面添加关键字partial,例如:
public partial class test
{
public string Content;
public void SetContent(string Content_in)
{
Content=Content_in;
}
}
在分布类中还可以声明分布方法,例如:
public partial class test
{
public string Content;
public void SetContent(string Content_in)
{
Content=Content_in;
}
partial void Reset();
}
注意:
分布方法隐式为private修饰符,不可使用public,不可有返回值
9.6命名空间
一、概述:
C#程序是利用命名空间组织起来的,类似于一个城市被划分为许多个区
二、具体讲解:
声明命名空间:
命名空间是.NET避免名称冲突的一种方式,定义相同的一个类,只要不在同一个项目内就不会造成名称冲突,使用namespace来声明命名空间,语法格式:
namespace 定义的命名空间名称
{
命名空间体
}
注意:
命名空间可以相互嵌套,如果没有显式提供命名空间,默认使用项目名作为命名空间
导入命名空间:
使用using关键字,语法结构:
using 命名空间名称
注意:
如果命名空间含有相同名称的类,在导入时需要指定具体的路径,如:
using System.Windows.Forms;
……
MessageBox.Show("Hello,C#");
实战练习:
编写一个控制台应用程序,实现以下功能:
1.设计一个Rectangle类,提供length,width字段计算面积和周长的两个方法,并使用Main方法来测试程序