Java Polymorphismus Frage

berto

Lt. Junior Grade
Registriert
Juni 2011
Beiträge
428
Hi liebe Leute,

ich stehe glaub ich gerade ziemlich auf der Leitung und hoffe ihr könnt mir schnell helfen...

ich habe folgendes Szenario (etwas abstrahiert):
Ich habe ein Java Programm, das 2 verschiedene Fälle behandeln soll. Dies wird anhand des ersten parameters, der beim Aufruf mitgegeben wird entschieden. Also ist zur gesamten Runtime jeweils nur 1 Fall aktuell.

Es gibt jede Menge andere Parameter, die über die command line mitgegeben werden, diese unterscheiden sich aber leicht je nachdem ob es Fall 1 oder Fall 2 ist.

Jetzt hab ich mir gedacht ich mache eine Klasse "Params" in der die Variablen, die für beide Fälle gelten definiert sind und dann 2 Klassen die davon erben und jeweils die verbleibenden 2-3 variablen definieren.

Gedacht war das ganze dann so:
Java:
Params params;

if(fall1){
   params = new ParamsFall1(args);
} else {
   params = new ParamsFall2(args);
}

//PROBLEM:
x  =params.definedInParent; 
//funktioniert; ist also eine der Variablen, die für beide Fälle gilt

y = params.definedInChild; 
//undefinierte Variable, da sie nicht in der Signatur der Parent Klasse definiert ist

z=((ParamsFall1)params).definedInChild; //funktioniert, aber finde ich sehr umständlich

Habt ihr Ideen wie man besser an das Problem herangehen kann?

Danke und lg
 
Zuletzt bearbeitet:
Poste doch mal auch die Klassen ParamsFall1 und ParamsFall2 mit den Teilen der hier verwendeten Variablen.
 
iamunknown schrieb:
Poste doch mal auch die Klassen ParamsFall1 und ParamsFall2 mit den Teilen der hier verwendeten Variablen.

also ebenso abstrahiert wäre das zb:
Java:
public class Params {
   int var1;
   int var2;
   String var3;
   //...

  //constructor
}

public class ParamsFall1  extends Params {
   int var6;
   int var7;
 
   public ParamsFall1(...) {
      super(...);
      this.var6 = var6;
      this.var7 = var7;
   }
}

public class ParamsFall2 extends Params {
   String var8;
   int var9;
 
   public ParamsFall2(...) {
      super(...);
      this.var8 = var8;
      this.var9 = var9;
   }
}
 
Der Klassiker ist ja, dass die Parameter über einen String identifiziert werden. Siehe alle Preference-Klassen. https://developer.android.com/reference/android/content/SharedPreferences https://docs.oracle.com/javase/8/docs/api/java/util/prefs/package-summary.html
Dann musst du gar keine Fallunterscheidung machen.

Aber zu deinem Anliegen: Zwei Ideen.
1.) 3 globale Klassen, allgemein, Fall1, Fall2. der Code wird wissen, welche er verwenden muss. Es ist immer entweder Fall1 oder Fall2 nicht null.
2.) Jede Funktion/Klasse die die Settings-Klasse braucht, hat die als Konstruktor. Es sollte nie vorkommen, dass eine allgemeine Klasse ein Objekt konstruieren muss, bei dem die Settings nicht die allgemeinen sind. Du lässt die Settings-Klasse dann einfach zerfallen, wenn es passiert (weil du ein allgemeines Objekt konstruierst). Sollte das nicht klappen, hat dein Design ein Fehler.
 
  • Gefällt mir
Reaktionen: berto
Java:
Params params;

// Verzweigung
if(fall1) {
   params = new ParamsFall1(args);
} else {
   params = new ParamsFall2(args);
}

// allgemein, Operation für alle Params identisch
x = params.definedInParent;

// spezifisch, Operation entweder für Fall1 oder Fall2
// (hier müsst du wieder unterscheiden, ergo if/else)
y = params.definedInChild;

// du nutzt hier einen unsicheren Type-Cast, der Cast wird scheitern wenn params vom Typ Fall2 ist
// (der einfachste Weg um sicher zu casten, ist vorher zu prüfen welcher Typ zur Laufzeit vorliegt)
z = ((ParamsFall1)params).definedInChild;

/*
    if (param instanceof Fall1) {
        // verarbeite Fall1
    } else {
        // verarbeite Fall2
    }
*/

Also führst du spezifische Operationen immer innerhalb einer if/else Verzweigung aus. Dann reicht aber auch einmal if aus um die beiden Fälle zu unterscheiden:
Code:
// allgemeine Operationen

if (fall1) {
     operationenFürFall1(); // type-cast nach Fall1?
} else {
     operationenFürFall2(); // type-cast nach Fall2?
}
 
  • Gefällt mir
Reaktionen: berto
Zurück
Oben