我刚刚了解了OOP。我对班里的私人成员感到困惑。
我看到了有关将变量成员设置为private的示例,因此不会在其他任何位置更改。
但另一方面,有一些公共方法,如getName()
和setName()
来获取和设置私有成员名称。
通过方法更改它并直接更改它有什么不同?有人可以帮我解释一下吗?
答案 0 :(得分:3)
此模式的主要论点是封装,如answer中所述。
但诚然,在您的name
示例中,封装的内容并不多。
以下是getter / setter方法与公共字段的两个优点:
通过setter方法设置值时,您可以检查并拒绝无效值,而如果某个字段是公开的,则无法控制分配给它的值。
您不需要提供setter 和 getter方法,这样您就可以将字段设置为只读或只写。
< / LI> 醇>答案 1 :(得分:0)
使用方法更改它可以更好地控制要应用的逻辑来访问成员变量。
例如,如果成员变量是readonly
变量,则可以省略set
方法的实现,这样任何人都无法写入内容。
或者另一方面,如果您只想写一个变量并且不希望任何人稍后阅读它,您可以实现set
方法。
setter将为您提供的另一件事是您可以在提交值之前进行验证。例如,如果您希望将某个格式的string
设置为成员string
变量,则可以在setter
函数中进行检查,如果匹配模式或拒绝,则接受它它,如果它没有。
通常是通过getters
和setters
更改/阅读成员变量的最佳做法
答案 2 :(得分:0)
作为一般经验法则,您希望在类属性和扩展点(私有&gt; protected&gt; public)上成为as restrictive as possible
。这对于长期运行且需要维护和重新分解的项目尤为重要。
一旦使用了一段时间,将您的属性从公共限制为受保护/私有是非常困难的,因为您不知道还有多少其他类依赖这些属性是公开的。另一方面,从私人到受保护/公共场所的放松不会造成创伤,因为如果没有这门课程,您不必担心之前对该房产的访问。
话虽如此,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;
}
}
您通常不会将名称设置给一个人,因此我们可以一起省略该名字。但每个人都有一个名字。既然如此,您可以通过其构造函数强制执行它。这使得这种区分变得明确,增强了您的设计并防止您的对象处于不一致状态。
答案 3 :(得分:0)
阅读论坛帖子。您可能会发现很多有价值的观点来理解这些概念。 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; }
};
我可以总结以下使用访问器的充分理由: