Есть ли способ опустить переменную из суперкласса? - PullRequest
3 голосов
/ 22 ноября 2010

Мой класс приложения использует библиотеку с двумя переменными по умолчанию.

   // 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)?

Не знаю, что делать?

Любые предложения, пожалуйста?

Спасибо

Ответы [ 5 ]

3 голосов
/ 22 ноября 2010

Вы не можете удалить эти поля, но вы можете переопределить методы получения и установки, чтобы сделать что-то отличное от значения по умолчанию (это зависит от их модификаторов доступа, но они, вероятно, будут protected или выше). Таким образом, вы можете остановить внешнее присвоение этих переменных, например. Если вы выберете этот маршрут, я бы посоветовал вам ознакомиться со способами использования этих полей в суперклассе, чтобы вы могли предвидеть любое поведение при включении.

1 голос
/ 22 ноября 2010

В общем случае 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;
  ...
}
1 голос
/ 22 ноября 2010

Все, что вы можете с этим сделать, - сделать эту переменную закрытой для суперкласса, чтобы подклассы не «видели» ее.

1 голос
/ 22 ноября 2010

Неа.Если вы наследуете, вы получаете весь класс.Если вы не хотите наследовать все поля, вы не разрабатываете подкласс.

Представьте себе, что произойдет, если вы опустите переменные - что бы унаследованные методы сделали с отсутствующим состоянием?Все сломалось бы ...

0 голосов
/ 22 ноября 2010

Когда вы расширяете класс, вы якобы добавляете больше переменных и методов, вы не можете вычесть.

...