第一阶段C#基础-15:面向对象梳理
面向对象对象三(四)大特征:封装,继承,多态,(抽象)
1_封装
(1)封装是指将数据(属性)和行为(方法)组合在一个类中,并对外部隐藏对象的内部实现细节
(2)封装的核心概念
数据隐藏:将类内部数据设为私有,只通过公共方法访问
实现隐藏:隐藏类的内部实现细节,只暴露必要的接口
保护数据的完整性:通过方法控制对数据的访问和修改
(3)属性的封装:将字段设为私有的,利用属性控制字段的访问
(4)方法的封装:将方法写在类中,通过类的实例或者类名调用方法
(5)封装的好处:
数据保护:防止外部代码直接修改对象内部的状态
灵活性:可以修改内部实现而不影响使用该类的代码
易于维护:将相关数据和操作组织在一起
减少耦合:类之间通过明确定义的接口交互
数据验证:可以在设置属性时添加验证逻辑
2_继承
(1)继承允许我们基于现有的类创建新的类,实现代码重用
(2)继承的特点:
单继承:c#只支持单继承,一个类只能继承一个父类
传递性:继承关系可以多层传递
所有的类都继承自object:即使没有显示指定,所有的类都隐式继承自System.Object
(3)继承中的访问修饰符:
public
:任何代码都可访问protected
:只有类内部和派生类可访问private
:只有类内部可访问(默认)internal
:同一程序集内可访问protected internal
:同一程序集或派生类可访问
(4)继承的基本语法:使用:
(5)子类的继承函数:当调用子类的构造函数(无参和有参)时,会先调用父类的无参构造,想调用父类的有参构造,需要子类的有参构造使用base(参数),调用父类的有参构造
3_多态
(1)多态:同一个行为具有不同的表现形式和能力
(2)多态的分类:
编译时多态(静态多态):通过方法重载(Method Overloading)和运算符重载(Operator Overloading)来实现。
运行时多态(动态多态):通过继承和接口,以及方法重写来实现
(3)静态多态在编译过程中,通过方法重载和运算符重载来实现,也成为静态绑定和早期绑定
动态多态在运行过程中,通过方法重写,隐藏方法来实现,也称之为动态绑定或者后期绑定
(4)方法重载:同一个函数名不同参数列表
(5)方法重写:
通过virtual和override关键字实现
public class Shape
{public virtual void Draw(){Console.WriteLine("绘制一个形状");}
}public class Circle : Shape
{public override void Draw(){Console.WriteLine("绘制一个圆形");}
}
通过new关键字实现
public class Shape
{public void Draw(){Console.WriteLine("绘制一个形状");}
}public class Circle : Shape
{public new void Draw(){Console.WriteLine("绘制一个圆形");}
}
4_接口
(1)接口:使用java,asp.net等编写的API接口。让其他人通过相应的请求协议(如:http/https)来访问。理解成“在接口服务器上定义多个方法,在客户端上调用这些方法,这样的一个过程,称为请求接口。
(2)C#中的接口:定义一套规则,其他类实现规则。规则===》锲约,合同。 接口必须实现,才能使用。接口也是多态性的表现。
5_类与方法
5.1 普通类:
(1)可以有实例成员,静态成员 实例字段 静态字段 实例方法 静态方法 实例事件 静态事件....不能由抽象方法
(2)访问普通类的成员的时候,要先确定是静态的还是非静态(实例的);静态 使用类名访问;非静态(实例的) 实例化对象访问
5.2 静态类
(1)普通类经过 stati 修饰之后 就会变成静态类
(2)静态类特点:
静态类不能实例化,即不能new,访问静态类中的成员的时候,通过静态类本身
静态类内部不能有非静态成员,只能由静态成员
静态类不支持继承,不能继承其他类,也不能被其它类继承
静态类中的构造函数必须是静态的,而且不能有访问修饰符
(3)静态类作用:封装工具类
5.3 抽象类
(1)抽象类和接口类似,都是为了制定一些规则,由子类去实现这些成员,而不是直接操作抽象类和接口
(2)能够被其他的类继承 也能继承其他的类 但是它里面的抽象方法不能实现
(3)不能实例 抽象类设计出来就是用来被继承的 和密封类是相对
(4)抽象类特点:
抽象类使用abstract 修饰
抽象类中可以实例成员,可以抽象成员 可以有静态成员 可以有虚方法
抽象类不能实例化,抽象类定义了之后,一般不直接使用它,而是使用它的子类
抽象类只有被继承,才有存在的意义
继承抽象类的子类,必须实现抽象类中的抽象成员
5.4 密封类
(1)关键字 sealed,设计不让其他类继承,但可以继承其他类,密封类中能包含 实例方法 静态方法 不能包含抽象方法 虚方法 和密封方法
(2)特点
不能被继承
可以实例化
可以有实例成员,静态成员,不能有抽象成员和虚成员
5.5 抽象方法,虚方法,密封方法
(1)抽象方法(abstruct):抽象方法 不能实现 必须等待子类继承后, 在子类中重写 override;先占个位置 不去实现 等待子类实现;"空壳"
(2)虚方法(virtual):和抽象方法类似 ;虚方法可以有方法体,而且在子类中 不强制重写;虚方法就是为了重写的 是虚拟的 先占位 业务逻辑也可以先写一点,将来在子类中重新实现业务逻辑;继承过来的虚方法 可以重写 也可以不重写
(3)密封方法(sealed override):sealed 修饰成密封方法,不想在后续的子类中重写;sealed 关键字应用在方法上的时候,必须和override 同时使用
必须是继承自父类的方法使用sealed override重写,并不希望后面的子类重写该方法
public sealed override void SealedFn1(){base.SealedFn1();}
5.6 总结表格
特点\类型 | 普通类 | 静态类 | 抽象类 | 密封类 |
---|---|---|---|---|
是否可以实例化 | 是 | 否 | 否 | 是 |
是否可以被继承 | 是 | 否 | 是 | 否 |
是否可以继承其他类 | 是 | 否 | 是 | 是 |
是否有普通成员 | 是 | 否 | 是 | 是 |
是否可以有静态成员 | 是 | 是 | 是 | 是 |
是否可以有抽象成员 | 否 | 否 | 是 | 否 |
是否可以有虚成员 | 是 | 否 | 是 | 否 |