Я попытаюсь объяснить в своих силах.Как использовать общий класс с конкретными объектами в статическом контексте?
Я использую Play Framework 2, и я сделаю много действий CRUD. Некоторые из них будут identitcal, поэтому я хотел бы использовать KISS и DRY, поэтому сначала я думал об абстрактном классе, который содержит методы list
, details
, , update
и delete
с общим объектом и расширяет этот класс, указав, какие объект для использования (модель & форма):
public abstract class CrudController extends Controller {
protected static Model.Finder<Long, Model> finder = null;
protected static Form<Model> form = null;
public static Result list() {
// some code here
}
public static Result details(Long id) {
// some code here
}
public static Result create() {
// some code here
}
public static Result update(Long id) {
// some code here
}
public static Result delete(Long id) {
// some code here
}
}
А класс, который будет использовать CRUD:
public class Cities extends CrudController {
protected static Model.Finder<Long, City> finder = City.find;
protected static Form<City> form = form(City.class);
// I can override a method in order to change it's behavior :
public static Result list() {
// some different code here, like adding some where condition
}
}
Это будет работать, если бы я не был в статическом контексте.
Но так как это так, как я могу это сделать?
Почему бы просто не переключиться на методы экземпляра? Inheritance не работает над методами класса в Java. – Vlad
Еще одна идея - заменить наследование композицией: просто иметь экземпляры CrudController и делегировать операции конкретному содержащему объект экземпляру. (Это все зависит от вашего дизайна, конечно.) – Vlad
@ Vlad: По первому вопросу, я не могу, Play требуется статический метод для контроллера. Теперь, во-вторых, я не уверен, что понимаю, не могли бы вы разработать (или создать новый ответ)? –