[Java] Interfaces und restriktive Methoden Implementierung

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Silthus, 12. Juni 2011 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 12. Juni 2011
    Interfaces und restriktive Methoden Implementierung

    Hallo zusammen,

    ich programmiere gerade ein Plugin für Minecraft und versuche eine API einzubauen, jedoch komme ich mit der Implementierung von einem Interface welches auf bestimmte Methoden einer Klassen zugreift noch nicht ganz klar.

    Ich habe ein eine Interface Klasse welche wie folgt aussieht und jederzeit erweiterbar sein soll:

    Code:
    public interface RCSHandler {
     
     public RCPlayer getPlayer(Player player);
     
     public int getExp();
     public int getSkillpoints();
     public int getLevel();
     public int addExp(int amount);
     public int substractExp(int amount);
     public int addSkillpoints(int amount);
     public int substractSkillpoints(int amount);
     
    }
    Code:
    public class RCSkillsHandler implements RCSHandler {
    
     private RCPlayer p;
     
     public RCPlayer getPlayer(Player player) {
     p = new RCPlayer(player);
     return p; // dieses Objekt soll eigentlich nicht returned werden sondern als Basis für die folgenden Methoden dienen
     }
    
     public int getExp() {
     
     return p.getExp();
     }
    
     public int getSkillpoints() {
     
     return p.getSkillPoints();
     }
    
    .....
    .....
    .....
    Dieses Interface implementiere ich dann in einer anderen Klasse und rufe dort die Methoden auf. Jedoch möchte ich nun, dass die Methoden, welche nach der getPlayer() Methode kommen von getPlayer() abhängig sind.

    Der Hintergrund ist der, dass ich eine normale Klassen habe RCPlayer in welcher alle diese Methoden vorhanden sind ich jedoch nur eine bestimmte Auswahl davon als API zugänglich machen will.

    Es soll z.B. niemand auf die setLevel() Methode in der RCPlayer Klassen zugreifen können.

    Mein Problem ist also, dass ich ein RCPlayer Objekt über das Interface erzeugen will aber das Objekt nicht Zugang zu allen Methoden in der RCPlayer Klasse haben soll, sondern nur auf die Methoden welche im Interface definiert wurden.

    Ich hoffe das war nicht zu umständlich ausgedrückt ^^.

    Hat da jemand vieleicht Ideen oder kann mir weiterhelfen?

    Greetz Silthus

    P.s.: Source gibt es hier zu sehen: https://github.com/Silthus/RCSkills
     
  2. 12. Juni 2011
    AW: Interfaces und restriktive Methoden Implementierung

    dann find ich das interface ein wenig überflüssig, denn mit "public", "protected" und "private" innerhalb der klasse hast du doch alles zur hand was du brauchst.

    wenn du nur das interface weiterreichst musst du die methoden ja jedes mal neu definieren.
     
  3. 12. Juni 2011
    AW: Interfaces und restriktive Methoden Implementierung

    Naja das Problem ist, dass ich die Methoden welche ich nicht zugänglich machen will an anderen Orten und Packeten in meinem Plugin gebraucht werden.
    Sobald ich die Methoden in private oder protected ändere sind sie nicht mehr in meinen anderen Klassen zugänglich.
     
  4. 12. Juni 2011
    AW: Interfaces und restriktive Methoden Implementierung

    dann würd ich eher zu einer abstrakten klasse raten:

    Code:
    abstract class RSCHandler
    {
     private RCPlayer p;
     
     public RCPlayer getPlayer()
     {
     return this.p;
     }
     
     public int getExp()
     {
     return this.p.getExp();
     }
     
     [...]
    }
    die du anschließend vererben kannst:
    Code:
    public class RCSkillsHandler extends RSCHandler
    {
     public RCSkillsHandler()
     {
     super();
     
     System.out.println(this.getExp());
     }
    }
    
    oder du erstellst eine wrapper-klasse mit all den methoden die du für deine api zugänglich machen willst.
     
  5. 12. Juni 2011
    AW: Interfaces und restriktive Methoden Implementierung

    Vielen Dank erstmal soweit habe ich das nun hinbekommen, allerdings zeigt er mir dann immernoch die getExp() Methode an:

    Code:
    abstract class PlayerHandler {
     
     private RCPlayer p = null;
     
     public PlayerHandler getPlayer(Player player) {
     this.p = new RCPlayer(player);
     return this;
     }
     
     public int getExp() {
     return this.p.getExp();
     }
    }
    Code:
    public class RCSHandler extends PlayerHandler {
    
     public RCSHandler(Player player) {
     
     }
     
    }
    Code:
    public class RCSkillsHandler {
     
     public static void main(String[] args) {
     
     Player player = null;
     RCSHandler handler = new RCSHandler(player);
     handler.getPlayer(player).getExp();
     handler.getExp(); // das soll nicht möglich sein sondern nur über handler.getPlayer(player).get...
     }
    }
    Ich möchte, dass auf die getExp() Methode nur zugegriffen werden kann wenn man vorher einen Spieler mit getPlayer aufgerufen hat.

    Ich glaube ich habe einfach einen rießen Knoten gerade im Hirn aber irgendwie komme ich net drauf ?(
     
  6. 12. Juni 2011
    AW: Interfaces und restriktive Methoden Implementierung

    das ist mmn. der falsche weg und macht irgendwie auch keinen sinn ^^

    versuch es mal so:
    Code:
    class PlayerApi
    {
     private Player p;
     
     public PlayerApi(Player p)
     {
     this.p = p;
     }
     
     public int getExp()
     {
     return this.p.getExp();
     }
    }
    
    Code:
    PlayerApi papi = new PlayerApi(player);
    papi.getExp();
     
  7. 12. Juni 2011
    AW: Interfaces und restriktive Methoden Implementierung

    Jop das es keinen Sinn macht habe ich auch gemerkt
    Habe nun eine normale Klasse erstellt und erzeuge davon das Objekt ^^.

    Danke dir für die Hilfe
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.