Class 通过getter和setter(accessor)函数访问私有变量有什么意义?
在类中,变量通常是私有的,用于封装,将变量限制在一定范围内可以更好地控制错误和减少bug。这是有道理的,因为可以访问变量的位置越少,该变量出现错误的位置就越少 然而,我总是看到变量变为私有,然后使用getter和setter函数检索该值(有时甚至是指向该变量的指针!)。例如,Class 通过getter和setter(accessor)函数访问私有变量有什么意义?,class,oop,object,encapsulation,Class,Oop,Object,Encapsulation,在类中,变量通常是私有的,用于封装,将变量限制在一定范围内可以更好地控制错误和减少bug。这是有道理的,因为可以访问变量的位置越少,该变量出现错误的位置就越少 然而,我总是看到变量变为私有,然后使用getter和setter函数检索该值(有时甚至是指向该变量的指针!)。例如,inta是私有的,以防止公共访问,但是getA()和setA()允许直接访问它们 那么,getter函数和setter函数不反对私有化吗?我的意思是带有访问器函数的私有变量与公共变量相同,只是访问它们的代码发生了变化。(ob
inta
是私有的,以防止公共访问,但是getA()
和setA()
允许直接访问它们
那么,getter函数和setter函数不反对私有化吗?我的意思是带有访问器函数的私有变量与公共变量相同,只是访问它们的代码发生了变化。(object.variable vs object.getVariable())
人们使用访问器函数将变量设置为私有,这有什么原因吗?与公开相比有什么优势吗
我一般说的是编程,但大部分是C语言(即C、C++、C、Obj-C).< /P> < P>,因为如果你改变了那个变量的内部表示,或者在设置或检索时想做更多的事情,它不会破坏使用它的所有其他类(如果它是一个库,你就不必改变你的API)。
这还意味着您可以轻松设置断点,以查看何时使用它(尽管大多数语言/调试器都有某种类型的数据断点)。可能您希望在库的下一个版本中添加一些检查(或在有人读取值时执行某些操作),以及变量是否在当前版本中是公共的,升级库版本将花费大量工作。这里的关键词和标签是“封装”。您正在隐藏
a
的详细信息,同时仍使其可用。我喜欢已经列出的原因,还有很多。还有一个问题,您正在调试,发现a
的值不正确。如果a
是公共的,您必须检查a
访问的每个地方。如果a
对于setter方法是私有的,那么您知道a
唯一可以更改的地方就是调用setA()
-这将是放置断点的好地方;) 类定义了行为,成员是对象的状态……因此有一个setter和一个getter定义了类的封装行为,即让其他人发现/更改对象状态
换句话说,区别在于让你的邻居进入你家,拿走他想要的东西(公开课堂上的所有对象)…或者确保邻居来问我他想要什么,我给他(有一个getter/setter…)为什么需要封装?为什么需要oop?难道C编程语言不能做我们今天所做的事情吗?问你自己。或者,如果您在拥有数百万行代码的大型系统上工作过。您所使用的是关键数据结构的公共变量,可从程序的每个模块访问。当我开始学习面向对象编程时,我想到了同样的问题,因为在大多数书籍中,他们只是将变量设置为私有,并添加公共方法(Getter/setter)来访问它们,所以我在想,如果我可以通过公共的方法访问这个变量,那么让这个变量私有又有什么意义呢 当我开始实现实际的业务应用程序时,我得到了答案 让我们考虑一个班级学生,包括学生姓名,卷号,3个科目的标记< /P>
Class Student {
private int rollno;
private int java_marks;
private int cpp_marks;
private int unix_marks;
private int percentage;
public int getJava_marks() {
return java_marks;
}
public void setJava_marks(int java_marks) {
if (java_marks > 100) {
System.out.println("Marks value should be less than 100");
//throw exception
}
this.java_marks = java_marks;
}
public int getCpp_marks() {
return cpp_marks;
}
public void setCpp_marks(int cpp_marks) {
if (cpp_marks > 100) {
System.out.println("Marks value should be less than 100");
//throw exception
}
this.cpp_marks = cpp_marks;
}
public int getUnix_marks() {
return unix_marks;
}
public void setUnix_marks(int unix_marks) {
if (unix_marks > 100) {
System.out.println("Marks value should be less than 100");
//throw exception
}
this.unix_marks = unix_marks;
}
public int getPercentage() {
this.percentage = (this.cpp_marks + this.unix_marks + this.java_marks) /3;
return percentage;
}
public int getRollno() {
return rollno;
}
public void setRollno(int rollno) {
this.rollno = rollno;
}
}
这里使用私有变量有两个原因
这将导致抽象中的安全性,而抽象中的安全性仅限于(只读)访问类变量。这实际上取决于语言。在限制性OO语言(C++,java)中,GETSt/Stter是一个常见的习惯用法,而在C++这样的更自由的语言中,它们通常是很差的。问题是答案。根据处理器(如x86),调试器可以在任何写入变量上设置数据断点(或跟踪点),这将完成相同的事情。