以下是关于在课堂中使用属性的问题。

我一直在使用公共属性,而不是公开曝光成员变量。多数人建议这种方法有助于封装。但是,我不理解封装优势,使其成为属性。

许多人养育者知道使用属性的真正原因。他们只是作为编码标准的一部分来做。

有人可以清楚地解释财产如何比公共成员变量更好,以及它如何改善封装?

有帮助吗?

解决方案

封装通过从更改中绝缘呼叫类来帮助。

让我们想象您有一个简单的课程,可以对汽车引擎进行建模(因为所有的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();
    }
    

    因此,它执行了一系列的动作。你 不要 依靠呼叫者正确执行此操作的事实。您的对象将始终处于正确的状态。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top