受保护的成员与继承java中的私有成员

时间:2014-07-18 10:40:55

标签: java inheritance constructor private protected

我有一个abstract class Entity,然后多个实例可以扩展实体

喜欢

A extends Entity {
}
B extends Entity {
}

现在所有实体都需要entityId

所以我应该entityId作为Entity中的私有字段并通过构造函数设置它,或者作为protected中的Entity成员设置它,以便子类可以直接访问它?

6 个答案:

答案 0 :(得分:2)

首先,您可以将entityId重命名为id,因为它显然是实体的ID。它是Entity的成员。

我将假设id无法更改,因此它应该是私有的,只设置一次且仅在构造函数中设置。该类应该有一个公共getId()方法。这样,除了子类之外,其他对象也可以访问它。

有了这个实现,id无法被子类意外更改。

答案 1 :(得分:1)

您应该将entityId作为实体基类型的一部分作为受保护。

答案 2 :(得分:0)

从设计角度来看,entityID应该是实体的一部分。因此,将其放在Entity类中并使其为protected,以便其子类可以访问它。

答案 3 :(得分:0)

这可能是protected成员存在的主要原因。基本上它与private相同,但除了对您的子类显示public到同一个包中的类之外(如果这是一个问题,请使用{{1} }})。

现在,这是继承结构中实例变量的一般理论,但正如其他人所指出的那样,因为这似乎与ID字段有关,所以最好将其设为private,也可能{{}} 1}}。然后编写一个private getter方法,除非没有人能够从子类中获取ID,然后将其设为final

答案 4 :(得分:0)

使用protected,以便所有继承的类都可以访问它。

如果基类constrctor接受实体id的值,如下所示

class Entity
{
  protected int EntityId;
  public Entity(int _entityId)
    {
       EntityId=_entityId;
    }

}

然后,您可以使用“super”函数从派生类构造函数

调用基类构造函数
class ExtendedEntity extends Entity
{

  public ExtendedEntity (int _entityId)
    {
       super(_entityId); // calling base class constructor
    }

}

答案 5 :(得分:0)

使其成为Entity中的私有字段并创建(受保护)访问器(getter / setter),以便子类可以通过setter或getter访问该字段(基本OO原则)

您还可以为Entity类编写特定的构造函数,将id作为参数,并从扩展类中调用此构造函数。通过这样做,您的子类总是被迫设置id。

例如

public class Entity {
    private int id;
    public Entity(int id) { 
        setId(id);
    }
    protected int getId() {
        return id;
    }

    protected void setId(int id) {
        this.id = id;
    }
}

public class A extends Entity {

    public A(int id) {
        super(id);
    }
}