面向对象-三大特性
面向对象三大特性
一、封装
1、什么是封装
封装是把一个或多个项目封闭在一个物理的或者逻辑的包中。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。其实是对某个实现方法的封装。
2、封装的意义
1、隔离性,安全性。更改内部实现细节时不会影响到外部对象的访问原则。
2、低耦合(面向对象编程我们一般提倡高内聚、低耦合),实现页面和逻辑分离。
3、可读性(我们可以通过方法名直接了解这个方法的作用,不必在了解方法的实现)
4、可扩展(定义不同的规则选择不同 的实现,减少代码耦合度)
3、访问修饰符
public:所有对象都可访问
private:只能对象本身的对象内部调用
interval:同一个程序集的对象内部进行访问
protected:这类对象的子类对象可以访问
protected internal: 当前程序集或派生自包含类的类型。
4、默认访问修饰符
在命名空间内部或编译单元顶部的所有类型(class、struct、abstract class、interface、delegate、enum),默认是internal,可以改为public
类中所有的成员,默认均为private
抽象类的所有成员,默认均为private类型,但抽象方法不能用private修饰
接口的所有成员,默认均为public类型,而且不能手动添加访问修饰符
结构的所有成员,默认均为private类型,而且只能是public、internal、private这三种类型
命名空间,枚举类型成员默认public,也不可能是其他访问修饰符
委托,默认internal
二、继承
1、什么是继承?
当一个类A能够获取另一个类B中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系。被继承的类B称为父类或基类,继承了父类的类A称为子类或派生类。总的来说两个不同的类,具有相同的属性时可以将相同的属性 剥离出来 作为基类,分别继承基类。(C# 不能多继承)
2、继承的意义
1)、减少代码冗余
2)、高可用性
3)、减少代码量、提高可读性
4)、可以通过子类来实现对父类的重写(为多态提供前提)
3、缺点:
1)、继承会破坏包装、父类实现细节给子类,增加了两个类中的耦合性。
2)、在继承机构中如果成员不被使用、分配给他们的空间不被利用,则会增加程序性能。
4、继承的特性:
1)、延续:父类存在,子类没有重写但可以使用;
2)、新增:父类没有,子类新增加的
3)、重写:父类子类都存在,但是父类不满足要求,子类对其进行重新定义;
override与overload
1、重写:(override )继承的子类中,方法签名相同( 方法名+形参个数 类型 顺序 )
2、重载:(overload)方法名相同,形参个数 类型 顺序 不同
三、多态
1、什么是多态?
就是在继承的基础上,子类继承并去重写其父类的方法来实现不同的执行过程。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
在 C#语言中体现多态有三种方式:虚方法,抽象类, 接口
多态的意义
优点:
1、简化编程接口(它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字)
2、简化代码(如果函数/方法参数中使用的是父类的类型,可以传入父类、子类的对象)
局限性:
1、父类类型的变量,不能直接调用子类特有的方法。必须强转为子类类型的变量,才能直接调用子类特有的方法
注意:子类中如果重写了父类的方法(多态),那么父类中的这个方法将不会再调用。
重载:
重载方法
重写overread
父类视图
父类类视图
子类视图
子类视图
执行方法:
执行方法
重写(new)
父类视图
父类类视图
子类视图
子类视图
执行方法:
执行方法
可以看出,当派生类Dog的Eat()方法使用new修饰时,Dog的对象转换为Animal对象后,调用的是Animal类中的Eat()方法。其实可以理解为,使用new关键字后,使得Dog中的Eat()方法和Animal中的Eat()方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。所以, Animal类中的Eat()方法不管用还是不用virtual修饰,也不管访问权限如何,或者是没有,都不会对Dog的Eat()方法产生什么影响
严格的说,不能说通过使用new来实现多态,只能说在某些特定的时候碰巧实现了多态的效果。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)