【问题标题】:Is it common for subclasses to use getters and setters to access superclass members? [duplicate]子类使用 getter 和 setter 访问超类成员是否常见? [复制]
【发布时间】:2014-04-15 15:58:21
【问题描述】:

请考虑以下情况:

class A{

    private int num = 10;

    public int getNum(){ return num; }

    public void setNum(int num){ this.num = num; }

}


class B extends A{

    private int num;

    public B(){

        num = getNum();

    }

}

在 Java 中,子类无需声明 protected(因为这会将它们暴露给整个包)就可以访问超类的私有成员的一种方法可能是使用超类的 getter 和 setter。不仅在子类的构造函数中,而且在任何需要的地方。

这是人们使用的东西吗?常见的?你见过这个吗?

【问题讨论】:

  • 这是一个有效的做法,虽然我没有看到实例变量 B.num 的意义——你可以在需要的地方使用 getNum()。
  • 你可以在使用私有变量的地方使用超类的方法。所以简而言之,您可以通过超类的public/protected方法使用private变量。即在这里你使用getNum() 方法返回num 的值。
  • 您写道“没有声明它们受保护(因为这会将它们暴露给整个包)”。那是错误的。 “受保护”意味着只有继承类可以访问。这似乎是您正在寻找的。​​span>
  • 为什么要在子类中重复num 字段? B 已经有一个名为num 的字段(getNum()setNum() 可以访问)从 A 继承。为什么要在 B 中重复它? (请注意,B 中的num 既不可访问,也始终为 0,给出的代码如图所示。)

标签: java inheritance


【解决方案1】:

是的,这是一种常见的方法,尤其是为了封装超类的内部工作。

考虑一个打算被子类化的库类。当使实例变量对子类可见时,有人必须更改超类并可能在新版本中删除该字段,这会使该库版本与旧版本不兼容。

这同样适用于您自己的类,但如果您将字段公开给内部子类,则可能不会有那么大的问题。

但是,使用另一个变量并像上面一样在构造函数中调用 getter 会产生问题,因为您还必须重写 setter 才能获得更改通知,这会增加复杂性和代码,但几乎没有好处。

【讨论】:

    【解决方案2】:

    是的。是很常见。并且最好公开字段(即使只是protected)。类的封装不仅是为了向构造和使用实例的代码隐藏细节,而且是为了向子类隐藏它们。

    我想说这不仅很常见,而且是(而且应该是)常态。我编写了数千个课程和数十个内部库;多年来,我没有公开、保护或打包成员字段。

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 2019-11-26
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      相关资源
      最近更新 更多