Spróbuję wyjaśnić, jak najlepiej.Jak używać klasy ogólnej dla określonych obiektów w kontekście statycznym?
Używam Play Framework 2, a zrobię dużo akcji CRUD. Niektóre z nich będą identyczne, więc chciałbym KISS i SUCHY, więc na początku myślałem o klasie abstrakcyjnej zawierającej metody ogólne z rozszerzeniem tej klasy, określając, które obiekt w użyciu (model & Form):
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
}
}
I klasa, która będzie wykorzystywać 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
}
}
to będzie działać, jeśli nie był w statycznym kontekście.
Ale jak to się dzieje, jak mogę to zrobić?
Dlaczego nie po prostu przejść do metod instancji? Dziedziczenie nie działa na metodach klas w Javie. – Vlad
Inną ideą może być zastąpienie dziedziczenia kompozycją: wystarczy mieć instancje CrudController i delegować operacje do określonego obiektu związanego z instancją. (Wszystko zależy oczywiście od twojego projektu.) – Vlad
@Vlad: Na pierwsze pytanie nie mogę, Play wymaga statycznej metody dla kontrolera. Teraz na drugi, nie jestem pewien, aby zrozumieć, czy mógłbyś rozwinąć (lub stworzyć nową odpowiedź)? –