object Objekt in Interface? HELP:-/

tinella

Erfahrenes Mitglied
hallo leute

bitte helft mir bin jetzt dann am durchdrehen.

ich hab ein interface und etwa 6 versch klassen die davon methoden implementieren.
nun muss ich ein property namens prop da übergeben (für die methode store) da ich dieses teil brauche für EINE von diesen klassen. die anderen fünf klassen brauchen das store vom interface aber ohne property. das heisst ich kann prop nicht einfach im interface der methode übergeben.

jetzt hat mir jemand gesagt dass ich das mit einem object machen soll nur wie und wo? sodass das object nur dann aufgerufen wird wenn man es braucht..


bitte helft mir..
:-/


tinella
 

hpvw

Erfahrenes Mitglied
Du kannst die Methode store im interface so definieren, dass sie ein Parameter vom Typ Object erwartet. Bei Aufruf der Methode an den fünf Klassen übergiebst Du null.
An der einen Klasse übergibst Du Deine Property.
In der Methode store in der einen einzigen Klasse überprüfst Du, ob das Object von dem Typ ist, den Du erwartest und machst dann einen typecast.
Ich mache dann immer noch folgendes:
Wenn es der falsche Typ ist suchst Du Dir in der JavaAPI 'ne hübsche Exception, z.B. IllegalArgumentException und schmeißt diese.
Aufrufende Klassen sollten darauf rücksicht nehmen und diese evtl. abfangen und sinnvoll verarbeiten.

Gruß hpvw
 

torsch2711

Erfahrenes Mitglied
Ansonsten, definierst du halt 2 Methoden store eine mit argument und eine ohne.


public void store();

public void store(Object obj);

und lässt diese funktion einfach leer bei den anderen Klassen.
Ist zwar kein schöner stil, aber auch wirksam.

Oder hab ich das problem nicht ganz verstanden?

Grüsse

Torsten.
 
Zuletzt bearbeitet:

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Falls die "anderen" Klassen von keine Klasse (außer Object ;) erben) könntest du auch eine abstrakte Klasse erstellen, welche die Methode store() als abstract deklariert und die Methode store(blabla ddd) mit einer default Implementierung ausstattest. Diese kannst du dann bei deiner "einen" Klasse wie gewünscht überschreiben.

Gruß Tom
 

hpvw

Erfahrenes Mitglied
zu Thomas Darimont:
Die Defaultimplementierung sollte dann die abstrake Methode store() aufrufen.
So kann es nicht passieren, dass man an einer Subklasse eine Methode aufrufen kann, die nichts "sinnvolles" tut.
 

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Die Default-Implementierung könnte aber auch eine UnsupportedOperationException werfen.
IMHO ist das sogar die bessere Wahl denn wenn man store(blabla ...) aufruft will man ja genau DIE Aktion durchführen für die store(blabla...) gedacht ist und nicht store() (kommt auf die Implementierung an)

Gruß Tom
 

hpvw

Erfahrenes Mitglied
Da wir natürlich nicht genau wissen, wofür die Methoden gedacht sind, kann darüber sicher lange diskutieren.
Das eine in der abstrakten Klasse definierte Methode per default eine UnsupportedOperationException wirft würde mich als Implentierer einer Subklasse ganz schön wundern.
Das kommt sicher ein bisschen auf den eigenen Programmierstil an.
Wenn ich 2 Methoden den gleichen Namen gebe und sie nur durch ihre Parameter zu unterschieden sind, dann sollen sie im Prinzip dasselbe tun, nur halt einmal mit Parameter und einmal ohne. Dann halte ich es für sinnvoll, dass die Mächtigere im Zweifel die weniger Mächtige aufruft. Mit Konstruktoren macht man das ja auch oft so.
Aber es gibt sicher viele Möglichkeiten und man kann wohl selten eine als falsch oder ultimative Lösung einstufen.

Gruß hpvw