【问题标题】:Access private member variables through public methods [duplicate]通过公共方法访问私有成员变量[重复]
【发布时间】:2016-06-06 14:05:29
【问题描述】:

我刚刚了解了 OOP。我对班级中的私人成员有点困惑。

我看到了有关将变量成员设置为私有的示例,因此它不会在其他任何地方更改。

但另一方面,也有像 getName()setName() 这样的公共方法来获取和设置私有成员 Name 例如。

通过方法改和直接改有什么区别?谁能帮我解释一下?

【问题讨论】:

标签: java c++ oop


【解决方案1】:

阅读此论坛帖子。您可能会发现很多有价值的观点来理解这些概念。 http://www.cplusplus.com/forum/lounge/101305/

下面的 getter 和 setter 示例类显示了一些好的做法。我们需要使用const 类型限定符等。我们还可以验证实现中的值。

例如:-

class ClassName{
     string name;
     int age;
     int weight;
public:
     void setName(string strName);
     void setAge(int iAge);
     void setWeight(int iWeight);
     string getName() const { return name; }
     int getAge() const { return age; }
     int getWeight() const { return weight; }
};

我可以总结以下使用访问器的充分理由:

  • 让未来的变化更容易
  • 用属性封装行为
  • 使您的公共界面免受更改
  • 设置不同的访问级别
  • 在设置或获取之前验证值

【讨论】:

  • 请不要提供仅链接的答案。
【解决方案2】:

作为一般经验法则,您希望在您的类属性和扩展点上成为as restrictive as possible(私有> 受保护> 公有)。这对于需要长时间运行并需要维护和重构的项目尤其重要。

一旦使用了一段时间,就很难将您的属性从公共限制为受保护/私有,因为您不知道有多少其他类依赖这些公共属性。另一方面,从 private 放松到 protected/public 的创伤较小,因为您不必担心以前在没有该类的情况下访问该属性。

话虽如此,getter 和 setter 为您提供了与类的私有成员交互的独特联系点。这在 OOP 中称为encapsulation。这意味着您可以确保与这些属性交互的每个人都以相同且一致的方式进行操作。一个愚蠢的例子是属性的规范化:

private String name;

public void setName(String name) {
    this.name = StringUtils.capitalize(name);
}

您在这里确保设置名称的人不需要关心其大小写,因为您通过 setter 强制执行它。这同样适用于 getter,根据需要应用业务规则。

与访问公共财产相比,您每次使用它时都需要利用它...

最后,我想说的是,盲目地向对象添加 getter 和 setter 是 bad practice。仅在有充分理由存在时才提供这些访问器。例如:

class Person {

    private name;

    public Person(String name) {
        this.name = name
    }

    public String name() {
        return name;
    }
}

您通常不会设置人名,因此我们可以一起省略该 setter。但是每个人都有一个名字。在这种情况下,您可以通过其构造函数强制执行它。这样可以明确区分,增强您的设计并防止您的对象处于不一致状态。

【讨论】:

    【解决方案3】:

    使用方法更改它可以让您更好地控制要应用于访问成员变量的逻辑。

    例如,如果成员变量是readonly 变量,则可以省略set 方法的实现,这样任何人都无法写入内容。

    或者另一方面,如果您只想写入一个变量并且不想让任何人稍后读取它,您可以实现set 方法。

    setter 将为您提供的另一件事是,您可以在提交值之前进行验证。例如,如果您希望将某种格式的string 设置为成员string 变量,您可以在setter 函数中检查它,如果它与模式匹配则接受它,如果不匹配则拒绝它.

    通过getterssetters更改/读取成员变量通常是最佳实践

    【讨论】:

      【解决方案4】:

      此模式的主要论点是封装,如 answer 中所述。

      但诚然,在您的 name 示例中没有太多封装。

      以下是 getter/setter 方法相对于公共字段的两个优点:

      1. 通过 setter 方法设置值时,您可以检查和拒绝无效值,而如果字段是公共的,则无法控制分配给它的值。

      2. 您无需提供 setter getter 方法,让您可以将字段设置为有效的只读或只写。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        • 2015-11-15
        • 2015-05-04
        相关资源
        最近更新 更多