Interfaces in anderen Interfaces implementieren

mueslirocker

Mitglied
Hallo,

ich denke, das fällt unter Datenstrukturen. Hoffe, ich bin hier wirklich richtig.

Also, mein Problem:

Ich habe eine Klasse, die einen Datensatz verwaltet. Sie hat also eine Reihe von Membervariablen, die sie auf irgendeine Weise verarbeiten kann. Außerdem stellt die Klasse zwei Methoden zum Hin- und Herkopieren der Variablen von und in andere Objekte gleichen Typs bereit.

Code:
public class MyObject {
    private String a;
    private String b;
    private ...
    ...
    public String getA() { return a;     
    public void setA(String a) { this.a = a; }
    public String getB()...
    ...    
    public void copyFromMyObject(MyObject object) {
        setA(object.getA());
        setB...
    }    
    public void copyToMyObject(MyObject object) {
        object.setA(getA());
        object.setB...
    }
}

Nun möchte ich die copy-Methoden auch von anderen Stellen aus nutzen können. Also habe ich ein Interface für die get- un set-Methoden geschrieben.

Code:
public interface IMyObject {
    String getA();
    String getB...
    
    void setA(String a);
    void setB...
}

public class MyObject implements IMyObject {
    ...
    public void copyFromMyObject(IMyObject object) {
        ...
    }
    ...
}

Das Interface wird von verschiedensten Quellen implementiert, die die Daten aus Textfeldern, XML-Dateien, Datenbanken und was weiß ich kopieren... oder zurückschreiben.

Das funktioniert alles noch wunderbar.

So, nun habe ich eine Log-Klasse, die Informationen über verschiedenste Objekte sammelt. Dafür hab ich noch ein Interface geschrieben.

Code:
public interface ILogObject {
    String getId();
    String getName();
    String getContent();
}

Das Interface wird von jeder Klasse implementiert, über deren Instanzen Logs geschrieben werden sollen. MyObject ist eine Klasse davon.

Code:
public class MyObject implements IMyObject, ILogObject {
    ...
    public String getId() {
        return getA();
    }
    public String getName() {
        return getB() + getC();
    }
    ...
}

Wichtig dabei ist, dass die Methoden von ILogObject komplett von den get-Methoden von IMyObject implementiert werden können.

So, nun endlich mein Problem:
Ich möchte, dass jede Klasse, die IMyObject implementiert, auch ILogObject implementiert. Und zwar auf die gleiche Weise wie MyObject.

Als erstes kann ich ILogObject damit direkt von IMyObject ableiten lassen.

Code:
public interface IMyObject extends ILogObject

Nun müsste ich bei jeder der Klassen, die IMyObject implementieren, auch diese Log-Methoden implementieren. Aber das will ich nicht. Die Methoden sollen immer gleich aussehen und wenn ich etwas ändern will, müsste ich das an allen Stellen machen. Außerdem mag ich Redundanz nicht.

Am liebsten hätte ich eine Implementation im Interface.

Code:
public interface IMyObject extends ILogObject {
    ...
    public String getId() {
        return getA();
    }
    ...
}

... aber das geht natürlich nicht.

Darum hab ich überlegt, eine abstrakte Klasse zu bauen, die IMyObject abstract und ILogObject richtig implementiert.

Code:
public abstract class SuperMyObject implements IMyObject {
    public abstract String getA();
    ...
    public String getId() {
        return getA();
    }
    ...
}

Das würde gehen, wenn meine Klassen, die IMyObject implementieren, von SuperMyObject ableiten würden. Aber diese Klassen leiten bereits von anderen Klassen ab. (Sogar von einigen generischen wie JFrame.)

Nun bin ich ziemlich ratlos, wie ich das am besten lösen kann.
Hat jemand einen guten Ansatz? Bin ich nur zu blind und denk zu kompliziert?

Ich danke schonmal für eure Mühen.

/edit

Eine neue Lösung hab ich jetzt gefunden...

Code:
public static ILogObject getLogObject(final IMyObject object) {
    return new ILogObject() {
        public String getName() {
            return object.getB() + object.getC();
        }
        ...
    };
}

Aber so wird bei jedem Aufruf ein neues Objekt erstellt. Ich könnte das erstellte Objekt jeweils in den Instanzen der Klassen, die IMyObject implementieren, als Membervariable speichern. Aber ich könnte dann die Objekte nicht einfach so an die Log-Klasse übergeben und müsste immer erst eine Membervariable holen und die übergeben. Das muss doch besser gehen.
 
Zuletzt bearbeitet:
Zurück