3

我试图了解类中 getter/setter 方法的用法。假设我们有一个名为 A 的类,其中包含一些公共实例变量,然后是一个带有参数的构造函数,其中参数从另一个类(主)传递给它。在构造函数内部,我们让这些实例变量等于传递的值。

现在,如果这个类被另一个程序员使用,没有什么能阻止他们直接访问/更改实例变量为无效的东西。通过将实例变量设为私有,我们可以消除对这些变量的访问。但是,如果我们希望间接或在某些特定条件下更新/更改这些实例变量,或者只是让人们可以访问实例变量,我们将为此创建一个 getter/setter 对。

好处?:
1.在set()方法下,只有在某些正当的理由下才
改变实例变量 2.这样我们就可以显示实例变量实际上是什么,而不给使用这个类的程序员改变它的能力。

这是一个正确的解释吗?

4

4 回答 4

7

封装——指将所有相关成员(变量和方法)放在一个对象中。将成员变量指定为私有可以隐藏变量和方法。对象应该从外部视图中隐藏它们的内部运作。良好的封装通过防止对象以意想不到的方式相互交互来提高代码模块化,这反过来又使未来的开发和重构工作变得容易。

在此处输入图像描述

能够封装类的成员对于安全性完整性很重要。我们可以保护变量免受不可接受的值的影响。上面的示例代码描述了如何使用封装来保护MyMarks对象不具有负值。对成员变量vmarks的任何修改只能通过 setter 方法进行setMarks(int mark)。这可以通过引发异常来防止对象MyMarks具有任何负值。

于 2012-10-21T09:45:29.407 回答
1

你的解释是正确的。另外(在我的脑海中):

  • 它允许更改类的实现(例如,如果您希望删除该字段并替换它),而不会强迫消费者与您的类进行任何不同的交互。
  • 它允许 AOP 框架拦截对您的 get/set 方法的调用。
  • 您可以通过注释指定访问方法的权限。
于 2012-10-21T09:41:28.663 回答
0

是的,你的解释是正确的。但这是因为语言的限制。例如,在 python 中,您不需要每次都编写 getter 或 setter,因为您可以覆盖成员变量的行为。例如:

class MyClass:
    def __init__(self, myproperty):
        self.myproperty = myproperty

如果每个人都以如下方式使用它:

print(new MyClass("test").myproperty)

你仍然可以改变你的吸气剂的行为:

class MyClass:
    def __init__(self, myproperty):
        self._myproperty = myproperty

    @property
    def myproperty(self):
        return self._myproperty + " changed behavior"

甚至没有触摸代码的二传手什么使用你的类:

   @myproperty.setter
   def myproperty(self, myproperty):
       if len(myporperty) > 0:
            self._myproperty = myproperty

有关更好的示例,请参阅属性参考。

于 2012-10-21T09:59:47.790 回答
0

如果一个实例变量只能被其类中定义的方法使用,那么它应该被设为私有。如果一个实例变量必须在一定的范围内,那么它应该是私有的并且只能通过访问器方法[getter以及 Setter] 方法。

于 2019-02-13T18:03:19.530 回答