以下是关于在课堂上使用属性的问题。
我一直在使用公共属性,而不是公开地公开成员变量。多数人建议这种方法有助于封装。但是,我不了解封装的优势,因为它是一个属性。
很多人都不知道使用房产的真正原因。他们只是将其作为编码标准的一部分。
有人可以清楚地解释一个属性如何比公共成员变量更好以及它如何改进封装?
答案 0 :(得分:6)
封装有助于将调用类与变更隔离开来。
让我们假设您有一个简单的类来模拟汽车引擎(因为所有的OO示例都应该涉及汽车类比:))。你可能有一个像这样的简单字段:
private bool engineRunning;
简单地将此字段设为公开或提供IsEngineRunning()getter似乎没有任何不同。
现在假设您使您的课程更复杂,您想删除该字段并将其替换为:
private bool ignitionOn;
private bool starterWasActivated;
现在,如果您有许多课程访问旧的engineRunning
字段,您必须将其全部更改(不良时间)。
如果您开始使用:
public bool IsEngineRunning()
{
return this.engineRunning;
}
您现在可以将其更改为:
public bool IsEngineRunning()
{
return ignitionOn && starterWasActivated;
}
并且类的界面保持不变(好时光)。
答案 1 :(得分:4)
最好公开属性而不是成员变量,因为这样可以在设置或获取成员变量的值时进行各种检查。
假设你有一个成员变量:
private int id;
你有一个公共财产:
public int ID
{
get
{
// do something before returning
}
set
{
// do some checking here may be limits or other kind of checking
}
}
答案 2 :(得分:2)
我会做的很简短。属性=灵活性
1 属性对于创建您不希望始终在类中保留的成员或现有成员的聚合/功能非常有用。
EG。年龄可以根据出生日期输出,canSwim可以从hasLimbs&&浮
2 在具有现有数据库的系统中处理意外更改[有没有人预测所有客户端的请求?]时,将成员公开为属性可能会有所帮助。
EG。当用户超过18年并且为了性能而缓存时,isAllowed为true。客户希望在美国运行该服务,如果为false,则可以返回false,并且仅在缓存为真时检查年龄
答案 3 :(得分:1)
一些想法:
您可以更改数据的内部表示,而不会影响调用类。
E.g。 (前)
public boolean isActive() {
return this.is_active;
}
(后)
public boolean isActive() {
return this.is_active && this.approved && this.beforeDeadline;
}
如果您的代码被其他人使用(即您的代码是第三方),这一点尤为重要。在某种程度上,您的接口/ API必须保持稳定。小的更改不应该影响使用它的其他代码的代码。
您可以进行更复杂的操作。考虑一个变量is_active
。也许更改此变量的值也会影响对象的其他属性。如果您在方法中封装了访问权限,则可以在此方法中处理此问题,并且调用者无需关心。
E.g。
public void setActive(boolean active) {
this.is_active = active;
this.startTimeout();
this.updateOtherInformation();
}
因此,它强制执行一系列操作。您不依赖于调用者正确执行此操作的事实。您的对象将始终处于正确的状态。