Implementierung eines Interfaces erweitern

Heimchen

Mitglied
Hallo alle zusammen,
ich komme eigentlich von C, daher vermute ich mal, dass mein Thema eher in die Kategorie Anfänger gehört.
Ich schreibe ein Plugin für ein Tool und binde dafür die API von dem Tool ein. Die Methoden geben mir ein Interface auf Elemente des Tools zurück. Jetzt würde ich gerne einige der Methoden der Elemente erweitern und wollte dazu von der Interface-Klasse ableiten - da wusste ich aber noch nicht, dass es nur ein Interface ist. Die Klasse, die das Interface implementiert, ist nicht dokumentiert. Kann ich trotzdem irgendwie die Klasse erweitern?
Meine Alternative wäre, meine Methoden prozedural in meine eigene Klasse zu schreiben. Aber ich will ja objektorientiert.
Gruß,
Heimchen

PS: Das Original-Interface kann ich nicht bearbeiten.
 
Zuletzt bearbeitet:

Flown

Administrator
Mitarbeiter
Ich weiß zwar nicht genau was du da machen willst, aber Interfaces kann man erweitern:
Java:
interface Equality<T> {
  boolean equalTo(T o);
}
interface Ordering<T> extends Equality<T> {
  boolean lessThan(T o);
}
Natürlich kannst du auch Klassen ableiten (auch wenn du den Source-Code nicht besitzt), wenn sie die richtige Sichtbarkeit aufweisen und nicht final sind.
 

Heimchen

Mitglied
Der Name der Klasse ist mir leider nicht bekannt. Das Problem ist, dass mein erweitertes Interface ja auch gleich die Implementierung meiner Erweiterung enthalten müsste, weil es ja nach wie vor von der Klasse der API implementiert wird.
Vielleicht macht es das etwas deutlicher. IApi ist das Interface, was ich über die Api abfragen kann, um Elemente meines Tools zu bearbeiten:
Java:
IApi e = getElement();
e.apiMethod();

Ich möchte jetzt quasi sowas haben:
Java:
public interface IMyApi extends IApi {
  void myMethod() {
    return;
  }
}

IMyApi e = (IMyApi) getElement();
e.apiMethod();
e.myMethod();
 

stg

Top Contributor
Du könntest überlegen Kompositionen zu nutzen:

Code:
public interface IMyApi extends IApi { ... }

public class MyClass implements IMyApi {
    private IApi api;

    MyClass() {
        api = getElement();
    }

    @Override
    public void apiMethod() {
        api.apiMethod();
    }
}
 

Flown

Administrator
Mitarbeiter
Ist das jetzt ein XY Problem? Kannst du genau sagen was du machen willst? Denn so funktioniert das nicht.
Wenn getElement() eine IApi zurückgibt kannst du da nicht casten oder implementierst du getElement()?
 

Heimchen

Mitglied
Nein, ich implementiere nicht getElement(). Es sieht auch in echt so aus:
Java:
import externalToolApi;    // implements method "static IApi getElement();"
import IApi;

public class myClass {
  static void main(String[] args) {
    IApi e = externalToolApi.getElement();

    myClass.myMethod(e);
  }

  static void myMethod(IApi e) {
    // Tu irgendwas mit e
  }
}

Statt myMethod prozedural aufzurufen, würde ich gerne objektorientiert arbeiten. Probiert hab ich das:
Java:
import externalToolApi;    // implements method "static IApi getElement();"
import IApi;

public interface myApi extends IApi {
  void myMethod() {
    // Tu irgendwas mit this
  }
}

public class myClass {
  static void main(String[] args) {
    IMyApi e = externalToolApi.getElement();

    e.myMethod(e);
  }
}

Wenn mich nicht alles täuscht, ist das in C recht einfach wie beschrieben möglich, weil es keine expliziten Interfaces gibt. Da kann ein Interface auch eine Implementierung enthalten.
 

dayaftereh

Top Contributor
Wie schon @stg erwähnt hat würde ich Kompositionen nutzen. Das heißt das von getElement() zurück gegebene Objekt einfach in einem eigenen Klasse Wappen und die Klasse implementiert dein MyAPI Interface. Wobei der Name hier des Interfaces nix sagend ist...

Damit kannst du dann die Methode die du von der externen API nutzt weiter delegieren und deine eigenen Methode hinzufügen.

Ich glaube diese Idee wird auch im Buch Working with Legacy Code erwähnt. Damit bekommst du ein schönes Design da du die unterliegende Bibliothek komplett von deinem Code Abstract machst und so es ermöglichst einfach die Bibliothek aus zu tauschen.

Der Schlüssel ist dein eigenes Interface...
 

Heimchen

Mitglied
Copy Paste im Eifer des Gefechts. Richtig wäre folgendes:
Java:
import externalToolApi;   // implements method "static IApi getElement();"
import IApi;

public interface myApi extends IApi {
  void myMethod() {
    // Tu irgendwas mit this
  }
}

public class myClass {
  staticvoid main(String[] args){
    IMyApi e = externalToolApi.getElement();

    e.myMethod(e);
  }
}
 

Heimchen

Mitglied
Das mit der Composition hat den kelinen Haken, dass IApi so um die 50 Methoden hat. Die möcht ich eigentlich nicht alle von Hand wrappen müssen...
 

Flown

Administrator
Mitarbeiter
Was du hier nachzubauen versuchst sind Extension-Methods und werden in Java in dieser Form nicht unterstützt. Also ich würde wie @stg schon gesagt hat einen Wrapper um dieses Objekt bauen.

PS: Wo ist jetzt der Unterschied von den einem Codesnippet zu den anderen?
 

dayaftereh

Top Contributor
Die Frage ist brauchst du alle 50 Methode ? Oder reichen dir 3 für den Anfang und die anderen kommen dann im Laufe des Projektes.

Kannst ja auch zwei Interface machen, einmal das Wrapper Interface und dein Interface mit eigenen Methode, das vom Wrapper Interface erbt. Damit kannst du zwei Implementierungsklassen machen und hast den Code einwenig separiert.
 

Heimchen

Mitglied
PS: Wo ist jetzt der Unterschied von den einem Codesnippet zu den anderen?
Da waren ein paar kleine Verschreiber, z.B. IMyApi vs. myApi, etc.

Das mit dem Wrapper scheint zu gehen. Das mit dem Delegieren in Eclipse kannte ich noch nicht.
Bekomme ich das denn auch so hin, dass sich das Handling mit meinem Wrapper-Interface nicht von dem der ursprünglichen API-Interfaces unterscheidet? In etwa so:
Java:
IApi1 eins = externalToolApi.getElement1();
eins.foo();

IApi2 zwei = externalToolApi.getElement2();
zwei.baa();

IMyApi drei = externalToolApi.getElement3();
drei.myFooBaa();
 

dayaftereh

Top Contributor
Ich meinte eigentlich so:

Interfaces:
Java:
public interface APIWrapper {
  // Methoden die du von IApi wrappen willst
  void methodeA();
  // ....
}

public interface MyAPI extends APIWrapper {
  // Deine Methoden die du selbst implementierst
  void myMethodeA();
  //...
}

Implementierung:
Java:
public class APIWrapperImpl implements APIWrapper {
  private IApi api = null;

  APIWrapperImpl(IApi api) {
    this.api = api;
  }

  public void methodeA () {
    this.api.methodeA ();
  }
}

public class MyAPIImpl extends APIWrapperImpl implements MyAPI {

  public APIWrapperImpl (IApi api) {
    super(api);
  }

  public void myMethodeA (){
    //...
  }
}
Factory:

Java:
public class MyAPIFactory {
  private MyAPIFactory (){}

  public static MyAPI create (IApi api) {
    return new MyAPIImpl(api);
  }
}

Usage:
Java:
IApi api = externalToolApi.getElement();
MyAPI myApi = MyAPIFactory.create (api);

myApi.methodeA ();
myApi.myMethodeA ();

Und dann kannst du alles noch mit Unittests testen ohne die unterliegende API zu nutzen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Implementierung eines Zustandsdiagramms Java Basics - Anfänger-Themen 19
B OOP Implementierung eines Heaps Java Basics - Anfänger-Themen 13
S Fragen zur Implementierung eines Binärbaums Java Basics - Anfänger-Themen 3
S Fragen zur Implementierung eines Adressbuches Java Basics - Anfänger-Themen 20
G Implementierung eines Kontos Java Basics - Anfänger-Themen 11
E Performante Implementierung eines "Hintergrundprogramms" Java Basics - Anfänger-Themen 10
D Datentypen Implementierung eines Binärbaumes Java Basics - Anfänger-Themen 7
ruutaiokwu JRE-/JDK-unabhängige PBKDF2WithHmacSHA512-Implementierung Java Basics - Anfänger-Themen 16
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
K Fehler bei der Implementierung Java Basics - Anfänger-Themen 6
J Implementierung gcd();square() Java Basics - Anfänger-Themen 98
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
A Implementierung von String toString methode() Java Basics - Anfänger-Themen 4
G Projekt architektur (implementierung) Java Basics - Anfänger-Themen 3
M Implementierung einer getNextId Methode Java Basics - Anfänger-Themen 5
J Implementierung Listen-ADT Java Basics - Anfänger-Themen 131
I GenericQueue / Implementierung als Ringspeicher Java Basics - Anfänger-Themen 4
MiMa Log4j2 implementierung Java Basics - Anfänger-Themen 4
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
G Array implementierung Java Basics - Anfänger-Themen 23
J ANTLR Installierung und Implementierung Java Basics - Anfänger-Themen 2
E Hilfe bei Implementierung von Methoden Java Basics - Anfänger-Themen 10
S SkipList Implementierung Java Basics - Anfänger-Themen 1
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
E hashCode implementierung Java Basics - Anfänger-Themen 9
S Implementierung der Klasse Konto und Nutzung bereits vorhandener Klassen Java Basics - Anfänger-Themen 7
O Generics - Implementierung Java Basics - Anfänger-Themen 7
A Hilfestellung zur Implementierung des Gaußsches Eliminationsverfahren Java Basics - Anfänger-Themen 4
K Bucketsort Implementierung Java Basics - Anfänger-Themen 0
K Mergesort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
K Quicksort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
S Klassen Klassendiagramm Implementierung? Java Basics - Anfänger-Themen 5
J Bucketsort Implementierung Java Basics - Anfänger-Themen 0
C Stack - listenbasierte Implementierung Java Basics - Anfänger-Themen 4
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
T Collections LinkedList<LinkedList<T>> - Implementierung Java Basics - Anfänger-Themen 10
F Implementierung von Interfaces -> Problem mit main Java Basics - Anfänger-Themen 12
D Resourcebundle implementierung Java Basics - Anfänger-Themen 2
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
Q Implementierung von Listenern Java Basics - Anfänger-Themen 4
B Klassen Hilfe bei Implementierung Java Basics - Anfänger-Themen 5
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
I Erste Schritte Implementierung der API Java Basics - Anfänger-Themen 2
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
M Quicksort implementierung Java Basics - Anfänger-Themen 23
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
U Doppelte Interfcae Implementierung Java Basics - Anfänger-Themen 10
K Kleiner Fehler bei Methoden Implementierung Java Basics - Anfänger-Themen 6
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
S OOP Implementierung Komposition, Aggregation, Assoziation und Generalisierung Java Basics - Anfänger-Themen 2
C Klassenhirarchien zur Implementierung von Fahrzegen Java Basics - Anfänger-Themen 26
BinaryLogic Datentypen Statistik Interface - untersch. Implementierung Java Basics - Anfänger-Themen 5
S Saubere Implementierung Java Basics - Anfänger-Themen 2
K Dijkstra implementierung 2.0 Java Basics - Anfänger-Themen 19
K dijskral implementierung Java Basics - Anfänger-Themen 14
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
K Game of Life Implementierung Java Basics - Anfänger-Themen 30
B OOP Problem bei Implementierung von Interface Java Basics - Anfänger-Themen 6
J HashSet Implementierung Java Basics - Anfänger-Themen 16
R NullPointerException in Queue-Implementierung Java Basics - Anfänger-Themen 11
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
B Effektive Implementierung für Darstellung großer Datenmengen in Jogl Java Basics - Anfänger-Themen 5
B Implementierung Java Basics - Anfänger-Themen 2
N Implementierung Tic tac toc Java Basics - Anfänger-Themen 25
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
Y Implementierung einer Potenzturm Funktion Java Basics - Anfänger-Themen 4
S Implementierung gegen Interfaces / List, ArrayList, LinkedList Java Basics - Anfänger-Themen 11
J Quicksort Implementierung-- Exception ArrayOutOfBounds Java Basics - Anfänger-Themen 6
U Implementierung Constructor Java Basics - Anfänger-Themen 7
T Problem mit Implementierung von einer HashMap aufgabe Java Basics - Anfänger-Themen 2
G Implementierung des Observer/Observable Patterns - Gut so? Java Basics - Anfänger-Themen 3
I Zugriff auf Implementierung verhindern Java Basics - Anfänger-Themen 8
D Implementierung nach MVC Java Basics - Anfänger-Themen 6
B Theoretische Frage zum Programmbau (nun zur Implementierung) Java Basics - Anfänger-Themen 8
H Implementierung von Interfaces Java Basics - Anfänger-Themen 4
G Implementierung von Bäumen Java Basics - Anfänger-Themen 2
N Probleme mit paint() bei Implementierung in ein Panel Java Basics - Anfänger-Themen 4
B Wie funktioniert die implementierung von c code in Java? Java Basics - Anfänger-Themen 7
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
J Farbe des Striches eines TitledBorders ändern Java Basics - Anfänger-Themen 2
pc pc pc pc pc letztes Element eines Arrays n Java Basics - Anfänger-Themen 3
walid Öffnungszeiten eines Geschäftes Java Basics - Anfänger-Themen 3
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
B Synchronisation eines kleinen Museums Java Basics - Anfänger-Themen 47
krgewb Breite und Höhe eines Bildes in base64 auslesen Java Basics - Anfänger-Themen 3
Sachinbhatt Was ist die Notwendigkeit eines Sammlungsframeworks in Java? Java Basics - Anfänger-Themen 2
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Inhalt eines Arrays ausgeben Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben