# konstruktor im interface



## stev.glasow (2. Jul 2003)

wieso kann ich im interface keine konstruktoren definieren ?


----------



## Nadja (2. Jul 2003)

Also ich bin mir da nicht ganz sicher, aber ich glaube das liegt daran, daß ein Konstruktor sowieso immer nur von einer Klasse implementiert werden kann. Er trägt ja auch den Namen dieser Klasse. Und da man Interfaces meist in mehreren Klassen implementiert würde es nicht so viel Sinn machen einen Konstruktor dort zu definieren. Statische Factory-Methoden sollten aber möglich sein...


----------



## stev.glasow (2. Jul 2003)

:arrow: was sind 'Factory-Methoden' ?

 :arrow: mein problem ist eigendlich, dass ich ein interface definieren möche das die klassen die dieses interface implementieren, 'gezwungen' werden eine bestimmtem konstruktor zu nehmen.


----------



## Nadja (2. Jul 2003)

Factory Methoden sind statische (static) Methoden, die ein Objekt erstellen. String.valueOf() oder Integer.valueOf() sind z.B. welche. Wenn man unterschiedliche Objekte einer Klasse erstellen möchte - also mit verschiedenen Übergabewerten - wird das normalerweise mit Factory Methoden gemacht, da man diesen Namen geben kann, die einem sagen wie, bzw. mit welchen Werten dieses Objekt erstellt und was das Besondere hier ist. Außerdem muß eine Factory Methode nicht jedes mal ein komplett neues Objekt erstellen, im Gegensatz zu Konstruktoren, so werden sie auch für die Implementation des Singleton Patterns verwendet.

Vielleicht solltest Du in diesem Falle wirklich auf eine Factory Methode zurückgreifen, da das die einzige Möglichkeit ist, die mir jetzt einfällt wie Du die Klassen dazu zwingen kannst, diese Methode zu implementieren.


----------



## bummerland (2. Jul 2003)

ist das nicht auch mit abstrakten Klassen bzw. Methoden möglich?


----------



## Nadja (2. Jul 2003)

Meinst Du Konstruktoren zu erzwingen, die eine bestimmte Signatur haben? Nicht das ich wüßte...

Ansonsten kannst du natürlich vieles von dem was Interfaces machen auch mit abstrakten Klassen machen, aber wenn Du aus Design-Technischen Gründen nicht alle Klassen, die die gewollten Methoden implementieren sollen, von einer abtrakten Superklasse abstammen lassen willst, müßtes Du Interfaces benutzen.

Beispiel: Die Klassen 'StoffKatze' und 'Katze' haben beide das Attribut 'Fell' und können/sollen die Methoden 'bürsten()' und 'istHaarig()' implementieren. Die Klasse 'Katze' stammt von der abstrakten Klasse 'Tier' ab, die die abstrakte Methoden 'gibLaut()', 'bürsten()' und 'istHaarig()' implementiert. 'Katze' implementiert diese Methoden dann selbst. Wenn man jetzt 'StoffKatze' auch von 'Tier' erben lassen würde, müßte diese Klasse auch 'gibLaut' implementieren, was aber keinen Sinn macht, da ein Stofftier keinen Laut geben kann. Also kreiert man statt dessen ein Interface 'MitFell' mit den Methodensignaturen 'bürsten()' und 'istHaarig()' und läßt die beiden Klassen 'StoffKatze' und 'Katze' dieses Interface implementieren.

Man könnte dann auch wunderbar in einer Klasse 'Ich' eine Collection 'meineLieblinge' implementieren und dort ein Objekt 'StoffKatze' und ein Objekt 'Katze' reinlegen. Wenn man dann eines dieser Objekte herausholt kann man dann mit ((HatFell)meinObjekt).bürsten() eine der Methoden aus dem Interface aufrufen.

Hmm... Das war ganz schön lang.  :wink:


----------

