Wie Interface initialisieren?



  • Hallo,

    Interfaces können ja keinen Konstruktor haben. Ich hab aber eine Klasse, die Objekte übergeben kriegen KANN, die das Interface "Editierbar" implementieren.

    Jetzt hab ich mir überlegt, dass meine Klasse eine Variable vom Typ

    Editierbar zuEditierendesObjekt = new Editierbar();
    

    spendiert bekommt. Das geht ja natürlich nicht, weil Editierbar ja ein Interface ist. Aber wie initialisier ich die Variable denn? Gar nicht initialisieren ist ja auch keine gute Idee...



  • Ich glaub du hast da nen kleinen Denkfehler

    Wenn Editierbar ein Interface ist dann gibt es eine Editierbar-Implementation (nennen wir sie EditierbarImpl) die du instantiieren kannst. Das sähe dann so aus.

    Editierbar zuEditierendesObjekt = new EditierbarImpl();
    

    Falls das Objekt aus einer ArrayList oder so kommt dann wirst du wahrscheinlich auch keine zusätzliche Instatiierung benötigen sondern wirst dir das Objekt holen, es auf Zugehörigkeit zum Interface Editierbar prüfen und dann auf Editierbar casten. Das Objekt kann dann Methodenaufrufe entgegennehmen etc. wie ein gewöhnliches Objekt eben.



  • Der Punkt ist ja, dass ich mehrere Klassen habe, die Editierbar implementieren. Und ich kann nicht von vorne herein sagen, welches editierbare Objekt an die Klasse übergeben wird. Deshalb hab ich ja das Interface erstellt. Damit die editierende Klasse schon mal weiss: Da kommt was, ich weiss zwar noch nicht genau was, aber es implementiert Editierbar.



  • Erklär mal:

    class Foo {
       public bar (Editierbar baz)
       {
          // mach was, was man mit "Editierbar"en Objekten machen kann
       }
    }
    
    class EtwasEditierbares implements Editierbar {
       ...
    }
    
    ...
    
    Foo foo = new Foo ();
    EtwasEditierbares edit = new EtwasEditierbares ();
    
    foo.bar (edit);
    


  • TimH. schrieb:

    Da kommt was, ich weiss zwar noch nicht genau was, aber es implementiert Editierbar.

    klingt n bisschen nach dem Factory Design Pattern...



  • @TimH: Wenn du eine generische Methode hast, die über ein Interface kommuniziert dann sollte es eigentlich egal sein welche Implementation genau du übergeben bekommst, da deine Methode nur die Menge der Messages an das Editierbar-Objekt weiterreichen kann, die über das Interface definiert wurden. Das ist ja auch eigentlich der Sinn solcher gemeinsamer Schnittstellen. Wenn du etwas anderes machst als im Interface definiert ist dein Klassendesign womöglich falsch.

    Was allerdings möglich ist:

    interface Editable
    {
    	public void printObject();
    }
    
    class Editable1 implements Editable
    {
    	public void printObject() {
    		System.out.println("I am Editable1");
    	}
    }
    
    class Editable2 implements Editable
    {
    	public void printObject() {
    		System.out.println("I am Editable2");
    	}
    }
    
    public class InterfaceTest
    {
    	public static void main (String args[]) {
    		InterfaceTest it = new InterfaceTest();
    		Editable ed1 = new Editable1();
    		Editable ed2 = new Editable2();
    
    		it.showInformation(ed1);
    		it.showInformation(ed2);
    	}
    
    	public void showInformation(Editable ed) {
    		ed.printObject();
    	}
    }
    

    Wie du hier erkennen kannst wird jeweils die richtige Methode für das entsprechende Objekt aufgerufen. Diesen Mechanismus (Polymorphie) kannst du ebenfalls benutzen.



  • In der Klasse Foo brauch ich glaub ich eine Variable, die das "Editierbare" repräsentiert. Sonst komm ich von dort aus nicht mehr an das "Editierbare" ran. Leider ist nicht klar, von welchem Typ die Variable GENAU sein wird. Und ich möchte sie ja im Konstruktor initialisieren.

    Erschwerend kommt noch hinzu, dass ich es gerne hätte, wenn ein editierbares Objekt nur OPTIONAL angegeben wird.



  • Wenn es doch eh optional ist, dann nimm doch null.


Anmelden zum Antworten