-
04-10-2019 - |
题
以下是关于在课堂中使用属性的问题。
我一直在使用公共属性,而不是公开曝光成员变量。多数人建议这种方法有助于封装。但是,我不理解封装优势,使其成为属性。
许多人养育者知道使用属性的真正原因。他们只是作为编码标准的一部分来做。
有人可以清楚地解释财产如何比公共成员变量更好,以及它如何改善封装?
解决方案
封装通过从更改中绝缘呼叫类来帮助。
让我们想象您有一个简单的课程,可以对汽车引擎进行建模(因为所有的OO示例都应涉及汽车类比:))。您可能有一个简单的字段:
private bool engineRunning;
简单地将该领域公开或提供ISENGINENNENN()GETETER似乎并没有什么不同。
现在假设您使课程更加复杂,您想删除该字段,并将其替换为:
private bool ignitionOn;
private bool starterWasActivated;
现在,如果您有很多课程访问旧 engineRunning
字段您必须去改变它们(糟糕的时期)。
相反,您已经开始:
public bool IsEngineRunning()
{
return this.engineRunning;
}
您现在可以将其更改为:
public bool IsEngineRunning()
{
return ignitionOn && starterWasActivated;
}
而且班级的界面保持不变(好时代)。
其他提示
更好地公开属性而不是成员变量,因为这将使您在设置或获取成员变量的值时进行各种检查。
假设您有一个成员变量:
private int id;
而且您有一个公共财产:
public int ID
{
get
{
// do something before returning
}
set
{
// do some checking here may be limits or other kind of checking
}
}
我会简短。属性=灵活性
1 属性对于创建您不想一直在课堂上持有或是现有成员的聚合/功能的成员很有用。
例如。可以根据出生日期输出年龄,可以从Haslimbs生成Canswim && floats
2 在处理现有数据库的系统中,将成员视为属性(是否有人预测所有客户端的请求?)时,将成员视为属性会有所帮助。
例如。当用户超过18岁并且被缓存以进行性能时,ISAlling是正确的。客户想在美国运行该服务,如果false被误解,您才能返回false
一些想法:
您可以在不影响呼叫类的情况下更改数据的内部表示。
例如 (前)
public boolean isActive() { return this.is_active; }
(后)
public boolean isActive() { return this.is_active && this.approved && this.beforeDeadline; }
如果其他人使用您的代码(即您的代码是),这一点尤其重要 第三方)。在一定程度上,您的界面/API必须保持稳定。小更改不应影响使用它的其他代码的代码。
您可以进行更复杂的操作。考虑一个变量
is_active
. 。也许更改此变量的值还影响对象的其他属性。如果将访问封装在方法中,则可以在此方法内处理此方法,而呼叫者不必照顾。例如
public void setActive(boolean active) { this.is_active = active; this.startTimeout(); this.updateOtherInformation(); }
因此,它执行了一系列的动作。你 不要 依靠呼叫者正确执行此操作的事实。您的对象将始终处于正确的状态。