2017-11-29 6 views
0

Ich entwickle eine Android-App mit MVP-Muster.MVP-Muster für das Retrive-Modell

Ich hätte gerne verschiedene Presenter, und jeder implementiert getItems, die eine getAll statische Methode des zugehörigen Modells aufrufen. Ich dachte, Generika zu verwenden, wie dies am Ende:

public class BasePresenter<T> { 
    protected T mModel; 

    List getItems() { 
     mModel.getAll(); 
    } 
} 

public class Presenter extends BasePresenter<Model> { 
} 

, aber ich kann getAll Methoden Verwendung von Generika nicht zugreifen, da kein Verfahren s Object‘ist.

Da für mich würde dumm sein, die gleiche langweilige Methode getAll() für alle Moderator zu schreiben, nur das Modell zu ändern, gibt es da einen Weg, das zu erreichen?

Ich frage, weil sogar in Googles offiziellen MVP Guide, es immer die gleiche Methode verwenden, um Daten zu reversieren, überschreiben es auf jedem Moderator, und ich hoffe, dass es einen besseren Weg gibt.

Ich dachte, die Superklasse mModel zu "werfen", aber ich weiß nicht, wie und wenn es möglich ist, obwohl zu tun.

Antwort

0

Versuchen Sie, diese

public class BasePresenter<M extends BaseModel<M>> { 

    @Nullable 
    private M mModel; 

    @Nullable List<M> getItems() { 
     if (mModel != null) { 
      return mModel.getModelList(); 
     } 
     return null; 
    } 
} 

Und das ist Basemodel

public abstract class BaseModel<M> { 

     private List<M> modelList; 

     public List<M> getModelList() { 
      return modelList; 
     } 

     public void setModelList(List<M> modelList) { 
      this.modelList = modelList; 
     } 
    } 

Sub Modell

public class LoginModel extends BaseModel<LoginModel> { 

    @Override 
    public List<LoginModel> getModelList() { 
     return super.getModelList(); 
    } 

    @Override 
    public void setModelList(List<LoginModel> modelList) { 
     super.setModelList(modelList); 
    } 
} 

Und schließlich Moderator ist wie folgt

public class LoginPresenter extends BasePresenter<LoginModel> { 
     //do your code 
} 

Hoffe, dass es Ihnen hilft.

+0

Vielen Dank, es funktioniert super. – spruzzi

+0

Toll, wenn diese Hilfe bitte meine Antwort akzeptieren. –

0

Vielleicht können diese Ihnen helfen:

List getItems(){ 
    if(mModel instanceof TheSuperClassOrInterface){ 
     return ((TheSuperClassOrInterface)mModel).getAll(); 
    }else{ 
     return null; 
    } 
} 
+0

In diesem Fall müsste ich ein if für jedes Modell hinzufügen, aber – spruzzi