Come generalizzare una classe che ha una funzione identica più una funzione aggiuntiva

0

Ho alcuni problemi di progettazione con il mio progetto. Per illustrare il mio problema, userò le seguenti due classi dal mio progetto.

public class RAM_UserManagement{
  private Map<int,User> userList;
  public User addUser(User user){//do stuff}
  public User deleteUser(User user){//do stuff}
  public User updateUser(User user){//do stuff}
  public List<User> getAllUser(){//do stuff}
  public User getUserById(int userId){//do stuff}
}

public class RAM_ServiceManagment{
  private Map<int,Serivce> serviceList;
  public Service addService(Service ser){//do stuff}
  public Service deleteService(Service ser){//do stuff}
  public Service updateService(Service ser){//do stuff}
  public List<Service> getAllSerivces(){//do stuff}
  public Service getServiceById(int id){//do stuff}
  public Service getServiceByStatus(ENUM_STATUS status){//do stuff}
  public Service getServiceByUserName(String Name){//do stuff}
}

Come puoi vedere, dalla natura di queste classi entrambi fanno esattamente la stessa cosa con alcune funzionalità extra. Sto cercando di generalizzarlo creando un'interfaccia. Questo è quello che ho in mente

public interface IStorage<T>{
  public T add(T item);
  public T delete(T item);
  public T update(T item);
  public List<T> getAll();//This is where I am struggling..
}

Quindi l'operazione CUD in entrambe le classi è ok da implementare ma il metodo R (Read) in entrambe le classi varia. In RAM_ServiceManagement ho extra getAll, getById, getStatus, getByName dell'altra classe.

Come posso generalizzare questo? o la generalizzazione non può essere applicata qui? Apprezzo davvero se puoi dare qualche suggerimento.

Grazie

    
posta Sas 14.08.2014 - 01:50
fonte

1 risposta

2

Vorrei provare qualcosa di simile al seguente:

public abstract class RAM_Management<T> {
    protected Map<Integer, T> dataList;
    public T addData(T data) { /* ... */ }
    public T deleteData(T data) { /* ... */ }
    public T udpateData(T data) { /* ... */ }
    public List<T> getAllData() { /* ... */ }
    public T getDataById(int id) { /* ... */ }
}

public class RAM_UserManagement extends RAM_Management<User> {
    // needs no separate implementation
}

public class RAM_ServiceManagement extends RAM_Management<Service> {
    public Service getServiceByStatus(ENUM_STATUS status) { /* ... */ }
    public Service getServiceByUserName(String name) { /* ... */ }
}

Usando una classe base astratta invece di un'interfaccia, si evita la necessità di riscrivere le implementazioni dei metodi comuni (assumendo che tutto ciò che fanno è interagire con il membro dataList protetto). Ho anche assunto che entrambi i metodi delle classi ' getXXXById funzionano allo stesso modo; se non lo fanno, allora lo togli dalla classe astratta e lo implementa nelle tue lezioni concrete.

    
risposta data 14.08.2014 - 12:35
fonte