Java Up- und Downcasting |
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
Hallo,
ich habe folgendes Problem: ich habe zwei Klassen eine Klasse Configuration und eine Klasse RemoteConfiguration. Die zweite ist eine Unter- bzw. Kindklasse der ersten und hat zusätzliche Felder (Port, Hostname, Username, etc.). Ich möchte jetzt zwischen den beiden Klassen casten und zwar so, dass ich aus der Configuration eine RemoteConfiguration machen kann und umgekehrt.
Es ist erwünscht, dass beim Casten von RemoteConfiguration in Configuration (also der Elternklasse) die Daten der Kindklasse (Port, ...) verloren gehen. Nur habe ich nachgelesen, dass dies nicht geht bzw. auch keinen Sinn macht, da die RemoteConfiguration ja bereits eine Configuration ist.
Ich möchte verhindern eine weitere Klasse zu schreiben welche (fast) leer ist nur um zwischen Remote und Local (das wäre die Leere Klasse) umschalten zu können, da die Klasse Configuration bereits alles beiinhaltet was ich benötige.
Mit freundlichen Grüßen
informaTiger
__________________ Why do Java developers wear glasses? Because they can't C#
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von InformaTiger: 27.06.2015 19:05.
|
|
27.06.2015 18:56 |
|
|
|
Und wenn du einfach eine Referenz auf die Elternklasse verwendest, also
code: |
1:
|
Configuration c = remoteConfigurationInstance; |
|
Aber die Polymorphie wird du so nicht los.
Ich weiß nicht, was du genau vorhast und ob der Cast wirklich nötig ist, aber du wirst das Objekt nicht mehr zur Elternklasse umbiegen können. Alternativ könntest du über eine Aggregation an Stelle einer Vererbung nachdenken.
code: |
1:
2:
3:
4:
5:
|
class RemoteConfiguration {
private Configuration c;
public Configuration getConfiguration() { return c; }
} |
|
__________________ Syntax Highlighting fürs Board (Link)
|
|
27.06.2015 20:55 |
|
|
|
Soweit ich sehe, überschreibst du die Basisklasse nicht, oder? Dann würde tatsächlich mein erster Vorschlag genügen.
Ansonsten erben LocalConfiguration und RemoteConfiguration beide von Configuration.
__________________ Syntax Highlighting fürs Board (Link)
|
|
28.06.2015 06:52 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
Wie meinst du das? Also RemoteConfiguration erbt von Configuration. Und LocalConfiguration würde das dann auch machen. Ich benötige nur für LocalConfiguration keine weiteren Felder, weswegen ich sie mir gerne gespart hätte.
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
28.06.2015 07:44 |
|
|
|
Du hast schon ganz richtig verstanden, was ich meine.
Manchmal geht es eben nicht so, wie man will. Ich hätte mich neulich sehr über Mehrfachvererbung gefreut, da muss man dann eben Kompromisse machen, wenn die Sprache das nicht hergibt.
__________________ Syntax Highlighting fürs Board (Link)
|
|
28.06.2015 07:48 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
Ja, na dann wird mir wohl nichts anderes übrig bleiben als eine "nutzlose" Klasse zu schreiben
Danke,
Mfg
informaTiger
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
28.06.2015 08:11 |
|
|
ed209
Routinier
Dabei seit: 07.09.2006
Beiträge: 324
|
|
Das klingt nicht so als wuerde es Dein Problem loesen.
Wenn Du von RemoteConfig nach Config castest hast Du noch immer ein Objekt der Klasse RemoteConfig. Lediglich deine Variable ist vom [I]Typ[/] Config. Wenn Du jetzt versuchst deine RemoteConfig-Objekt nach LocalConfig zu casten bekommst du einen Laufzeitfehler.
Das Objekt wird zu keinem Zeitpunkt veraendert.
Wenn Downcasts noetig sind, ist das meistens weil die Abstraktions-Level nicht sauber sind, und das ist eigentlich vermeidbar, solange das Framework das man verwendet einen nicht dazu zwingt.
Mal ganz simpel gefragt:
Was hindert Dich daran eine einzelne Klasse zu machen, die alle informationen enthaelt und ein weiteres Feld "boolean isRemoteConfig" falls noetig.
Und in dem Moment wo jemand auf lokal umstsellt, setzt Du alle Werte die Du nicht haben willst auf null
Wenn Du wirklich darauf bestehst zwei verschiedene Klassen zu haben, dann wuerde ich das mit Delegation und einem gemeinsamen Interface loesen. Aber den Aufwand wuerd ich nur rechtfertigen wenn die Abstraktion es wirklich erfordert
Gruss,
ED
|
|
28.06.2015 13:51 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
Ok, ich werde dann sehen welcher Lösungsweg am geeignetsten ist und diesen wählen.
Danke.
Mfg
InformaTiger
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
04.07.2015 11:27 |
|
|
|