面试题答案
一键面试使用访问修饰符
- private:
- 注意点:将类中不希望外部直接访问的属性和方法声明为
private
。例如在一个电商系统的User
类中,用户的密码属性password
应设为private
,防止外部直接获取或修改密码。 - 实际场景:在登录逻辑中,
User
类可能有一个authenticate
方法,该方法内部可以访问private
的password
属性进行密码验证,而外部代码无法直接访问password
。 - 错误示例:如果将
password
设为public
,任何外部代码都能获取和修改密码,严重违反封装原则,增加安全风险。
- 注意点:将类中不希望外部直接访问的属性和方法声明为
- protected:
- 注意点:用于类内部及子类访问。例如在一个游戏开发项目中,有一个
Character
基类,其中一些与角色基础状态相关的属性和方法(如生命值计算的内部逻辑方法)设为protected
,这样子类(如Warrior
、Mage
等角色子类)可以继承并根据自身需求扩展这些属性和方法,而外部代码无法直接访问。 - 实际场景:
Warrior
子类可能需要基于Character
类的protected
方法来调整自身生命值恢复逻辑。 - 错误示例:若错误地将这些本应在继承体系内使用的属性和方法设为
public
,外部代码可能随意调用或修改,破坏类的内部逻辑一致性。
- 注意点:用于类内部及子类访问。例如在一个游戏开发项目中,有一个
- public:
- 注意点:仅将需要暴露给外部使用的属性和方法设为
public
。在一个文件管理系统的File
类中,getName
方法用于获取文件名,可设为public
,方便外部代码获取文件名称信息。 - 实际场景:当其他模块需要展示文件相关信息时,可通过调用
public
的getName
方法获取文件名。 - 错误示例:如果将一些内部用于文件处理的临时状态变量设为
public
,外部代码可能误操作改变其状态,导致文件处理逻辑出错。
- 注意点:仅将需要暴露给外部使用的属性和方法设为
属性和方法设计
- 属性:
- 注意点:属性应尽量保持简单和原子性,避免属性直接暴露复杂的内部状态。例如在一个图形绘制系统的
Shape
类中,Shape
类有一个表示位置的属性position
,应设计为一个简单的对象(如{x: number, y: number}
),而不是将x
和y
的计算逻辑直接暴露在属性层面。 - 实际场景:当需要移动
Shape
时,可以通过修改position
属性,而不是直接操作复杂的位置计算逻辑。 - 错误示例:若将复杂的位置计算逻辑(如涉及多个图形之间相对位置计算)直接放在属性的
get
或set
方法中,外部代码调用时难以理解和维护,违反封装原则。
- 注意点:属性应尽量保持简单和原子性,避免属性直接暴露复杂的内部状态。例如在一个图形绘制系统的
- 方法:
- 注意点:方法应职责单一,一个方法只做一件事。例如在一个订单处理系统的
Order
类中,有calculateTotalPrice
方法专门用于计算订单总价,validateOrder
方法专门用于验证订单的合法性。 - 实际场景:在订单提交流程中,先调用
validateOrder
验证订单,再调用calculateTotalPrice
计算总价。 - 错误示例:如果将验证订单和计算总价的逻辑放在一个方法中,当需要单独验证订单或计算总价时,就会出现耦合问题,且违反了单一职责原则,破坏封装性。
- 注意点:方法应职责单一,一个方法只做一件事。例如在一个订单处理系统的
常见违反封装原则错误总结
- 过度暴露内部状态:将本应是
private
或protected
的属性设为public
,导致外部代码可以随意访问和修改类的内部状态,破坏类的封装性和数据一致性。 - 方法职责不清晰:一个方法承担过多职责,方法内部逻辑复杂,导致难以理解、维护和复用,同时也使得外部调用者难以正确使用该方法,破坏了封装性。
- 属性设计不合理:属性过于复杂,将复杂计算逻辑或过多内部状态暴露在属性层面,外部代码在操作属性时容易引发不可预见的问题,破坏封装性。