6

以下是关于在类中使用属​​性的问题。

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

许多人不知道使用属性的真正原因。他们只是将其作为编码标准的一部分。

有人能清楚地解释一个属性如何比公共成员变量更好,以及它如何改进封装吗?

4

4 回答 4

8

封装有助于将调用类与更改隔离开来。

假设您有一个模拟汽车引擎的简单类(因为所有 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;
}

并且类的界面保持不变(美好时光)。

于 2010-05-25T09:33:15.333 回答
5

最好公开属性而不是成员变量,因为这样可以在设置或获取成员变量的值时进行各种检查。

假设你有一个成员变量:

private int id;

你有一个公共财产:

public int ID
{
    get 
    { 
       // do something before returning
    }
    set 
    {
      // do some checking here may be limits or other kind of checking
    }
}
于 2010-05-25T10:46:54.070 回答
3

我会简短地说。属性=灵活性

1属性对于创建您不想一直保留在类中的成员或现有成员的聚合/函数很有用。

例如。可以根据生日输出年龄,可以从 hasLimbs && floats 生成 canSwim

2在具有现有数据库的系统中处理意外更改[是否有人预测所有客户端的请求?] 时,将成员公开为属性会很有帮助。

例如。isAllowed 当用户超过 18 岁并被缓存以提高性能时为真。客户希望在美国运行服务,如果缓存为 false,您可以返回 false,仅当缓存为 true 时才检查年龄

于 2010-05-25T10:10:57.027 回答
1

一些想法:

  • 您可以在不影响调用类的情况下更改数据的内部表示。

    例如(之前)

    public boolean isActive() {
        return this.is_active;
    }
    

    (后)

    public boolean isActive() {
        return this.is_active && this.approved && this.beforeDeadline;
    }
    

    如果您的代码被其他人使用(即您的代码是3rd-party),这一点尤其重要。在某种程度上,您的接口/API 必须保持稳定。小的更改不应影响使用它的其他代码的代码。

  • 您可以进行更复杂的操作。考虑一个变量is_active。也许改变这个变量的值也会影响对象的其他属性。如果你将访问封装在一个方法中,你可以在这个方法中处理这个,调用者不必关心。

    例如

    public void setActive(boolean active) {
        this.is_active = active;
        this.startTimeout();
        this.updateOtherInformation();
    }
    

    因此,它强制执行一系列操作。您不必依赖调用者正确执行此操作的事实。您的对象将始终处于正确状态。

于 2010-05-25T09:33:28.917 回答