有没有办法从超类中省略变量?

时间:2010-11-22 03:27:58

标签: java jpa eclipselink

我的应用程序类使用一个默认包含两个变量的库。

   // A class from framework:

public class SuperClass implements Serializable {

  private long id;
  private long version;

  // getter and setter methods for these variables...

}

我应该扩展这个类,以便访问框架的一些功能。

如果我将这个课程扩展到我自己的课程:

public class MyClassChild extends SuperClass {

  private long myprimarykey;
  private String some column;
  private long myversion;

  // getter and setter methods for these variables...

}

根据编程模型,这两个变量也是可访问的。 在实现需要类型为SuperClass的对象的操作时。

有没有想法扩展那个不包括这两个变量(id, version)的SuperClass?

我不知道该怎么办?

有任何建议吗?

由于

5 个答案:

答案 0 :(得分:3)

您无法删除这些字段,但您可以覆盖getter和setter以执行默认值以外的操作(这取决于其访问修饰符,但它们可能为protected或更高)。例如,通过这种方式,您可以停止外部分配这些变量。如果您选择此路线,我建议您熟悉这些字段在超类中使用的方式,以便您可以预测任何连锁行为。

答案 1 :(得分:1)

不。如果你继承,你就会得到整个班级。如果您不想继承所有字段,那么您就不是在设计子类。

想象一下如果你可以省略变量会发生什么 - 继承方法对现在缺失的状态会做什么?一切都会破裂......

答案 2 :(得分:1)

你所能做的就是让那个变量对超类是私有的,所以子类不会“看到”它。

答案 3 :(得分:1)

通常,JPA不允许您覆盖超类映射以删除属性,但根据您的提供程序,可能会执行以下操作:

public class MyClassChild extends SuperClass {

  private long myprimarykey;
  private String some column;
  private long myversion;  

  // Override superclass mappings
  @Transient
  long getId() { return super.getId(); }
  @Transient
  void setId(long id) { return super.setId(long id); }
  // etc...
}

修改

此外,还可以使用@AttributeOverride注释覆盖映射超类中各列的值,例如

@AttributeOverride(name="id", column=@Column(name="EMP_ID"))
@Entity
public class MyClassChild extends SuperClass {

  private String some column;
  ...
}

答案 4 :(得分:0)

当你扩展一个类时,你应该添加更多变量和方法,你不能减去。