C#是由类组成的。在接下来的讲解中我讲通过类将C#面向对象编程基础串一遍。
我把类分为三种:抽象类、接口、实体类。
抽象类
对于一个类当我们使用关键字abstract的时候,这个类就是抽象类。
抽象类和抽象方法存在的意义?
为了能够实现基类和派生类对方法Print的多态行为,通常情况下我们需要首先,在基类Person将Print方法声明为虚方法,然后在多层派生类中,运用覆载重写Print方法,得到Student和GraduateStudent的属于自己的Print方法。这样就可以实现多态行为。而实际情况是,有的时候,我们没有必要在基类Person中也定义Print方法的具体实现过程,我们并不关心或使用到基类Person的Print方法,不需要基类的Print方法为我们提供任何服务,在这种情况下,编写基类Person的Print方法的具体实现过程,就会显得毫无意义和浪费时间,我们要使用的仅仅只是派生类Student或GraduateStudent的Print方法,并能够实现Print方法的多态行为。这个时候,多态就派上用场了,我们只需将基类的Print方法声明为抽象方法,只提供方法头,而不必编写方法体的具体实现内容。
接口
接口可以看成是一种特殊的类。从程度上看,接口要比抽象类更为抽象,而抽象类则比具体类来得抽象。
特点:
- 类实现接口;
- 接口中不包含任何代码,有的只是契约;
- 类不能够多重继承,而接口可以实现多重继承;
在接口的实现中,如果有不同命名空间的两个相同名字的接口需要我们实现,该如果实现呢。
实体类
下面通过实体类来说明一下类的内脏器官。
创建类和对象
类的声明
[属性集信息] [类修饰符] class 类名 [:基类]
{
[类成员] //包括类的属性和方法
}
类的实例化(创建对象)
类名 对象名= new 类名();
构造函数和析构函数
构造函数和析构函数没有返回类型。
构造函数
当我们定义一个一个类之后,就可以通过new运算符将其实例化,产生一个对象。为了能够规范安全的使用这个对象,C#提供了实现对象进行初始化的方法,这就是构造函数。
语法形式:
[访问修饰符] <类名>([参数列表])
{
//构造函数的主体
}
如果要写一个带参数的构造函数,一点要写一个空的构造函数(不带参数的构造函数),否则会出错。
一个学生类的举例
class student
{
internal string studentNo,studentName, studentSex;
internal int studentAge;
public student() //一个静态构造函数,不带参数
{
//对student类的四个属性赋予初始值
studentNo = "10001";
studentName ="小王";
studentSex ="男";
studentAge = 19;
}
//带参数的构造函数
public student(string no,string name,string sex,int age)
{
studentNo = no;
studentName = name;
studentSex = sex;
studentAge = age;
}
}
析构函数
一般来说,创建一个对象时需要用构造函数初始化数据,与相对应释放一个对象时就用析构函数。所以析构函数是用于实现析构类实例所需操作的方法。
语法形式:
~ <类名>()
{
//析构函数的主体
}
析构函数不能写返回类型,也不能带参数,一个类最多只有一个析构函数。
如果没有显示的声明析构函数,则编译器自动产生一个默认的析构函数。
注意:析构函数不能由程序显示的调用,而是由系统在释放对象时自动调用。
方法
语法格式:
[访问修饰符] 返回类型 <方法名>(参数列表)
{
//方法主体
}
默认的访问修饰符为private,如果不需要返回任何值,使用void类型。
当我们声明一个方法后,调用时语法:
对象名.方法名([参数列表]);
静态的方法不需要实例化,就可以直接调用。
类的数据成员可以分为静态字段和实例字段。静态字段是和类相关联的,不依赖特定对象的存在;实例字段是和对象相关联的,访问实例字段依赖于实例的存在。因此根据静态字段和实例字段的特性,构造函数将其分为静态构造函数和实例构造函数,方法也将其分为静态方法和实例方法。
通常,一个方法使用static修饰符时,则表明该方法为静态方法,同时说明它只对这个类中的静态成员操作,不可以直接访问实例字段。
方法的重载
方法的重载是指能够具有不同数量参数或者返回值不同的方法。但是方法名必须相同。像这样的方法的集合叫做方法的重载。
作用:让类以统一的方式对不同数据执行相似的功能。
属性
C#使用属性实现了良好的数据封装和数据隐藏。把字段域和访问他们的方法相结合。对类的用户而言,属性的值和写于字段域语法相同;对编译器来说属性值得读和写是通过类中的封装的特别方法“get”和“set”访问器实现的。属性点的声明方法如下:
[属性集信息] [属性修饰符] 类型 成员名
{
访问器声明
}
属性修饰符:与方法修饰符相同
类型:指定该声明引入的属性的类型。
成员名:指定该属性的名称。
访问器声明:声明属性的访问器,可以是一个get访问器或一个set访问器,或者两个都有。
继承
继承是面向对象语言的基本特征,是实现代码复用的手段。继承使得在原有的类的基础上对原有程序进行扩展,从而提高程序开发的速度实现代码的复用。继承不但可以使用类的所有功能,还可以对这些功能进行扩展。继承产生的类成为派生类或子类。被继承的类成为父类或基类
Base关键字:调用基类对象的构造函数,也可以调用基类的方法。
多态
多态也是面向对象语言的基本特征之一。指在程序执行之前无法根据函数名和参数确定调用哪一个操作,而在程序执行过程中,根据实际运行情况动态确定,从而代理编程的高度灵活性。使用虚方法可以实现多态。
重载与覆写的区别:
重载:特定方法名必须相同;参数列表必须不相同;返回类型可以不相同。
覆写:子类中为了满足自己的需要来重复定义某个方法的不同实现;通过使用override关键字来实现覆写;只有虚方法(virtual)和抽象方法(abstract关键字)才能被覆写;要求(三相同):相同的方法名;相同的参数列表;相同的返回类型。