使用继承时如何进行强封装?

问题描述 投票:3回答:3

我真的很陌生,所以如果这太愚蠢我很抱歉。在Java中使用继承时,我很难决定使用哪种可见性。

对于我所阅读的内容,要进行强大的封装,通常会将属性设置为私有,并使用公共方法访问它们。

但是当你有内在的时候,这是不行的?当我阅读Oracle文档时,它表示只有公共/受保护成员才会继承到子类。但如果我这样做,我是否打破了封装?

同时,我在我的超类上使用私有属性,并且我使用公共方法在我的子类上访问这些字段。例如:

abstract public class Person{

  private String name;

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

  public String getName(){
    return this.name;
  }

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

public class Employee extends Person {

  private int salary;

  Employee(String name, int salary){
    super(name);
    this.salary = salary;
  }

  public void getDescription(){
    return "Name is " + getName() + " and salary is " + this.salary;
  }

}


java oop inheritance encapsulation
3个回答
0
投票

也许在可见性上查看javadoc,但在您的情况下受保护是正确的关键字,您也可以省略可见性然后它默认为包


0
投票

我打破了封装吗?

你没有破坏任何东西。受保护的成员对于世界其他地方仍然不可见(不包括包中的类和子类)。

Modifier    Class   Package Subclass    World
private       N        N       N          N
protected     Y        Y       Y          N

如果您需要对其进行直接控制并绕过可能使该访问失真的getter / setter,则受保护的字段绝对可以。

另一方面,当你不经常使用该字段时,私有字段是有意义的:private String name;"Name is " + getName()是完全正确的,因为你不关心究竟将返回什么 - 任何代表名称的东西就足够了。

根据经验,“使用对特定成员有意义的最严格的访问级别。使用private,除非你有充分的理由不这样做。”


0
投票

对于我所阅读的内容,要进行强大的封装,通常会将属性设置为私有,并使用公共方法访问它们。

要进行强大/适当的封装,请将属性设置为私有。完全停止。您不应该通过任何方法访问这些属性,您应该提供使用这些属性来实现业务逻辑的某些部分的方法。

[...]它说只有公众/受保护成员才会继承子类[...]

一切都将被继承,它只对子类不可见。所以它将成为对象的一部分,你无法直接访问它。

[使用公共/受保护的属性]但是如果我这样做,我是否打破了封装?

是。当你使内部状态可用时,你几乎总是打破封装,直接(使其成为私有),或者使用“getter”或类似的方法。

© www.soinside.com 2019 - 2024. All rights reserved.