每日一学:基础知识精讲
ok,终于也是要写完了,真是令人激动。话不多说有请今天的主角——封装(Encapsulation),依然用邮轮运输的场景讲透核心逻辑。
封装的核心:“打包+控权”
其本质可以总结两个方面:
1.打包:把对象的“属性(数据)”和“操作属性的方法(行为)”捆绑在一起,形成一个独立的“类”(比如邮轮的“船名,载货量”是属性,“运输货物”是方法,打包在CargoShip类里)
2.控权:隐藏对象内部的敏感细节,只对外暴露“安全的接口”-----简单来说就是“不该看的不让看,不该改的不让改”。
拿之前的例子来类比,就像邮轮的驾驶室---普通乘客(外部代码)不需要知道方向盘怎么联动船舵,发动机怎么调功率(隐藏内部细节),只需要通过“船长下达指令”这个接口(公开方法),让邮轮按规则航行(执行逻辑);如果谁都能直接掰方向盘,邮轮很容易失控(数据被随意修改导致错误)
我们基于之前的邮轮代吗,给货运邮轮/客运邮轮嘉善封装特性,对比 “未封装” 和 “封装” 的区别:
上述代码,明显可以看出我可以随意赋值,甚至连负数都能写,这样严重破坏数据合理性,导致业务逻辑出错。
上面是经过封装后的货运邮轮类。
数据安全:通过setter 添加校验逻辑,避免非法数据(比如负数,空船名)进入,保证了业务逻辑的正确性。
降低耦合:外部代码只依赖公开接口(get/set/transport),不关心内部属性怎么存储、方法怎么实现 —— 比如后续修改 “载货量” 的单位(吨→千克),只需改 setter 和 transport 方法,外部代码无需改动。
易维护:所有对数学的操作都集中在类内部,出问题只需排查类里的接口,不用翻遍所有外部代码。
结合之前的内容,四大特写不是孤立的:
父类TransportShip封装通用的属性(船名)和方法(transport),子类继承后,再封装自己的特有属性(载货量 / 载客量)。
子类重写 transport 方法体现多态,而重写的方法内部依赖封装的私有属性,保证数据安全。
总结:继承解决 “复用”,多态解决 “灵活”,封装解决 “安全”,抽象解决 “规范”—— 四大特性相互配合,才是面向对象的完整逻辑。
新手提醒:
- 过度封装:给所有属性都加 get/set,哪怕属性完全不需要外部访问(比如邮轮的 “发动机编号”);
- 封装不全:属性私有化了,但 setter 没加校验(比如允许载客量为负数),等于白封装;
- 打破封装:为了方便,在子类里直接访问父类的私有属性(正确做法是用父类的公开接口)。
最后感谢各位的观看!下一期讲解一下常用的设计模式,我会结合原神的场景介绍一下他们都用了哪些设计模式。