我有一个abstract class Entity
,然后多个实例可以扩展实体
喜欢
A extends Entity {
}
B extends Entity {
}
现在所有实体都需要entityId
所以我应该entityId
作为Entity
中的私有字段并通过构造函数设置它,或者作为protected
中的Entity
成员设置它,以便子类可以直接访问它?
答案 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);
}
}