C#基础回顾--面向对象
什么是面向对象
面向对象是一种对现实世界理解和抽象的方法。实现过程就是将现实的对象抽象成类/接口等,通过实例化出来的对象进行交互(调用)实现功能。
简单的理解就是,对象是类的实例化,面向对象就是面向类的实例化,类则是我们对现实事物/业务的抽象
面向对象的三大特征
1)封装
封装是指将现实事物/业务对象抽象成系统类/接口的过程。
封装的类只提供必要的共有属性/函数,将私有信息定义为私有访问级别,外部无法访问。封装对象的属性/方法的访问级别由访问修饰符定义。
- public:所有对象都可以访问;
- private:对象本身在对象内部可以访问;
- protected:只有该类对象及其子类对象可以访问
- internal:同一个程序集的对象可以访问;
- protected internal:访问限于当前程序集或派生自包含类的类型。
2)继承
子类自动共享父类数据结构和方法。C#的类支持单一直接继承,但是可以实现多个接口
何时使用继承?
1、子类可以完全继承父类信息,而不至于影响子类功能,并且父类的信息对子类是必要的。
2、当多个类拥有共同的属性/方法,并且其功能相近时,我们可以将共同的属性/方法提升,构建共同的父类。
例如
public class BaseController:ControllerBase { /// <summary> /// 获取通用的成功结果 /// </summary> /// <returns></returns> protected object GetSuccessResult() { //TODO generate success result return null; } /// <summary> /// 获取通用的失败结果 /// </summary> /// <returns></returns> protected object GetFailureResult() { //TODO generate failure result return null; } }
3)多态
1、重载(overload): 在同一个作用域(一般指一个类)的两个或多个方法函数名相同,参数列表不同的方法叫做重载,它们有三个特点:
- 方法名必须相同
- 参数列表必须不相同
- 返回值类型可以不相同(返回值不同,参数列表一样,方法名一样,这是不可以的)
2、重写(override):子类通过override关键字重写父类的虚方法或者抽象方法。子类对象赋值给父类变量,父类调用子类重载的方法时,实际执行的是子类重写的方法(不是父类本身的方法)。其特征就是子类的重写的方法与父类方法定义是一样,只是多了override进行修饰。
3、重建/隐藏(new):子类通过new关键字重建与父类同名同参数列表的方法。子类对象赋值给父类变量,父类调用子类重建的方法时,实际调用的是父类方法(注意这点与重写的区别)
类、抽象类、接口
类
类是对具有相同属性的事物的抽象封装。类的实例化则是对象。
抽象类
抽象类是指用abstract进行修饰的类,抽象类不能实例化(抽象类可以不包含抽象方法和抽象属性,但是此时它声明为抽象类其实是毫无意义的)。
抽象类特征:
- 抽象类可以包含抽象方法和抽象访问器。
- 抽象类不能实例化
- 不能用 sealed 修饰符修改抽象类,这意味着该类不能被继承。
- 从抽象类派生的非抽象类必须实现包括继承的所有抽象方法和抽象访问器,否则编译报错。
接口
接口(interface)用来定义一种程序的协定。实现接口的类的协定(方法,索引器,属性,事件)必须与接口的定义严格一致(类可以进行扩展,不是要求只能是实现接口)。
- 接口不可实例化
- 接口可以包含方法、属性、事件和索引器。
- 接口本身不提供它所定义的成员的实现。它只指定实现该接口的类或接口必须提供的成员。
抽象类与接口最大的区别在于抽象类可以包含具体的实现,接口是定义一种协定、规范。所以我们在什么情况下使用接口,什么情况下使用抽象类也就很明显了:当同类事物拥有相同属性较多时,我们就可以定义为对应的抽象类;如果我们需要的是协定、规范时则定义接口。
一个类可以实现多个接口,但是只能直接(间接是可以继承多个的)继承一个类