目录
·对象
一个具体的个体,就是一个对象。
通过类实例化出来的就是对象。
1.对象的语法
类名 对象名 = new 类名();
Apple a1 = new Apple();
2.类与对象的关系
类用于描述一类事物的信息;
对象是这个类中的一个具体的个体。
·字段
变量在面向对象的类中就叫做字段。
用于存储一些具体的信息。
1.语法
public 数据类型 字段名;
·对象使用方法
1.实例化对象
类名 对象名 = new 类名();
2.字段的赋值与取值
赋值:对象名.字段名 = 值;
取值:对象名.字段名
·访问修饰符
public:公开的。通过对象名.xxx 的形式可以直接访问到。
private:私有的。通过对象名.xxx 的形式访问不到。
protected:受保护的。只能在当前类的内部,以及该类的子类中访问;实例对象访问不到。
internal:只能在当前程序集(项目)中访问;在同一个项目中 internal 和 public 的访问权限是一样的。
protected internal:protected + internal 的访问权限。
·属性
属性的作用是对字段进行保护,我们将属性设为 public,可以直接访问,然后属性保护的字段设置成private,我们通过属性间接的操作字段。
语法:
public 数据类型 属性名
{
get{return 字段名;}
set{字段名 = value;}
}
get:当通过属性名取值的时候,会自动调用 get 中的代码;
set:当通过属性名给字段赋值的时候,会自动调用 set 中的代码;
·命名空间
命名空间,也叫名称空间,英文名是namespace。
用于对代码文件进行分类管理。
语法:
定义命名空间:namespace 空间名称{ 类 }
引入命名空间:using 空间名称
·三种方法
方法就是函数,在面向对象编程的类中,函数称之为方法。
1.普通方法
语法:
访问修饰符 返回值 方法名(参数列表)
{
方法的具体功能代码;
}
2.构造方法
构造方法可以对实例化出来的对象进行初始化。
语法:
public 类名()
{
构造函数代码;
}
①构造方法要用public 修饰,不能用private 修饰;
②构造方法没有返回值,且连void 也不能写;
③构造方法的方法名字必须跟类名一样;
④构造方法是可以有重载的。
当我们使用new 关键字实例化一个对象的时候,会首先执行构造方法。
当我们的类中不写构造方法的时候,在代码编译后,系统会自动给它添加一个空构造方法,如果我们写了一个构造方法,默认的“空构造方法”就不会存在。
3.析构方法
构造方法用于初始化一个对象,析构方法常用清理一个对象
语法:
~类名()
{
析构方法代码体;
}
①析构方法不能有任何参数;
②析构方法无返回值也无访问修饰符;
③析构方法由系统自动调用;
④析构方法可以不写。
·继承
面向对象开发有三大特性(特点 / 特征):封装,继承,多态。
将一堆类中的一些共有的“成员”单独抽取出来,作为一个父类,然后这一堆类继承这个父类,共享父类的资源,这就叫做继承。
优点:
①优化代码结构,让类与类之间产生关系(人不是孤立存在的,类也一样);
②提高代码的复用性,便于阅读(写更少的代码,干更多的活);
③为“多态”提供前提(多态是面向对象最复杂的一个特性)。
语法:
子类继承父类,使用“:”冒号关键字符。
class 子类:父类
{
//类成员;
}
子类继承父类的 字段、属性、普通方法、构造方法。(private修饰在子类中访问不到,public修饰可以访问到,使用base.(字段名/属性名/方法名),构造方法使用base())
·多态
在继承关系的前提下,实例化出不同的对象,这些对象调用相同的方法,但是却表现出不同的行为,这就叫做多态。
在 C#语言中体现多态有三种方式:虚方法,抽象类,接口。
1.虚方法
在父类中使用 virtual 关键字修饰的方法,就是虚方法。
在子类中可以使用 override 关键字对该虚方法进行重写。
语法:
父类:
public virtual 返回值类型 方法名()
{
方法体代码;
}
子类:
public override 返回值类型 方法名()
{
方法体代码;
}
①将父类的方法标记为虚方法,就是在父类方法的返回值前加 virtual 关键字,表示这个方法可以被子类重写。
②子类重写父类方法,在子类的方法的返回值前加 override 关键字。
③父类中的虚方法,子类可以重写,也可以不重写。
④父类中用 virtual 修饰的方法,可以用于实现该方法共有的功能(比如初始化该方法),然后在子类重写该方法时,使用 base 关键字调用父类中的该方法。
2.面向对象原则
开闭原则
单一职责原则
里氏替换原则
迪米特原则
接口隔离原则
依赖倒置原则
合成复用原则
2.1里氏转换原则
①子类对象可以直接赋值给父类变量;
②子类对象可以调用父类中的成员,但是父类对象永远只能调用自己的成员;
③如果父类对象中装的是子类对象,可以将这个父类对象强转为子类对象;
is 和 as 两个关键字都可以进行类型转换。
is:如果转换成功,返回 true,失败返回 false;
as:如果转换成功,返回对应的对象,失败返回 null。
3.抽象方法
当我们父类中的这个方法已经虚到完全无法确定方法体的时候,就可以使用另外一种形式来表现,这种形式叫抽象方法。
抽象方法的返回值类型前用关键字 abstract 修饰,且无方法体。抽象方法必须存在于抽象类中。
4.抽象类
在定义类的关键字 class 前面加 abstract 修饰的类就是抽象类。
子类继承抽象类,使用 override 关键字重写父类中所有的抽象方法。
<1>抽象类中不一定要有抽象方法,但是抽象方法必须存在于抽象类中。
<2>抽象类不能被实例化,因为抽象类中有抽象方法(无方法体),如果真能实例化抽象类的话,调用这些无方法体的方法是没有任何意义的,所以无法实例化。
5.接口
当抽象类中所有的方法都是抽象方法的时候,这个时候可以把这个抽象类用另外一种形式来表现,这种形式叫接口。
接口使用 interface 关键字定义,没有 class 关键字,接口名一般使用“IXxxx”这种方式进行书写,在一堆脚本中通过名字判断,I 开头的都是接口。
接口中不能包含字段,但是可以包含属性。 接口中定义的方法不能有方法体,全是抽象方法,但又不需要用 abstract 修饰; 接口中的成员不允许添加访问修饰符,默认都是 public;
<1>接口中所有的方法都是抽象方法,所以接口不能被实例化;
<2>一个类可以实现多个接口,被实现的多个接口之间用逗号分隔开;
<3>一个接口可以继承多个接口,接口之间也要用逗号分隔。