Announcement

Collapse
No announcement yet.

Noch abstrakter als Abstrakt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Noch abstrakter als Abstrakt

    Hallo Leute,

    ich bräuchte eine abstrakte Methode in der Superklasse in der ich erst in der Abgeleiteten Klasse den Rückgabewert der Methode definiere. Leider handelt es sich bei den Rückgabewerten um primitive Datentype (int;long;float;double). Ich kann mir die Antwort bereits denken aber gibt es eine Möglichkeit den Rückgabetyp zu ändern?
    AlexDgG

    Es gibt keine dummen Fragen. Nur dumme Antworten!

  • #2
    Hatten wir schon....nein
    Christian

    Comment


    • #3
      ein Fall für Generics

      Tach alex,

      das sieht mir nach einem Fall für Generics aus.

      Gruß ngomo
      http://www.winfonet.eu

      Comment


      • #4
        das sieht mir nach einem Fall für Generics aus.
        Weniger, da diese mit primitive Datentypen nicht funktionieren. Und würde er die Klassen Integer usw. benutzen bräuchte er keine Generics; er könnte den Rückgabetyp ändern
        Christian

        Comment


        • #5
          Vielleicht könnten auch Transformer-Methoden helfen. Ich beschreibe mal kurz das Problem was ich habe.

          Ich bin gerade dabei einen Mathematischen Expresions Interpreter zu implementieren. Da bin ich gerade bei den Variabeln. Ich habe die Basisklasse AbstractVar und von dieser leite ich jetzt IntVar, LongVar, FloatVar, DoubleVar …etc. ab. Jetzt wäre es gut, wenn jede dieser abgeleiteten Klassen über eine Methode getValue() verfügt und auch den Rückgabewert in genau ihrem Datentyp zurückliefert. Dies ist auch möglich, wenn ich die Methode getValue() nicht in der Basisklasse definiere. Was allerdings den Nachteil hat, dass ich in der Verarbeitung von Arrays oder Vectoren, wie z.B.

          Code:
          AbstractVar[] var = new AbstractVar[4];
              var[0] = new IntVar();
              var[1] = new LongVar();
              var[2] = new FloatVar();
              var[3] = new DoubleVar();
          ohne explizites Cast nicht auf die Methode getValue() zugreifen kann. Ich müsste jedes Mal mir erst den Typ der jeweiligen Instanz ermitteln und dann ein Cast machen. So lassen sich mathematische Operationen allerdings nur sehr umständlich ausführen.

          Ein Ansatz wäre in der Superklasse die Methode

          Code:
          public abstract Object getValue();
          Verfügung zu stellen und in den abgeleiteten Klassen dann z.B.

          Code:
          public Object getValue(){
          	return new Interger(1);
          }
          Dann bräuchte ich für jeden Datentyp nur eine Transformer-Methode

          z.B.

          Code:
          public int transform(Integer i){
          	return i.intValue();
          }
          Wenn ich allerdings diese Methode aus o.g. Kontext aufrufe

          Code:
          transform(var[0].getValue());
          Ist var[0].getValue() vom Typ Object. Allerdings steckt je in dem Objekt ein new Integer(1);

          Hat jemand einen vernünftigen Ansatz wie man so was lösen kann?
          AlexDgG

          Es gibt keine dummen Fragen. Nur dumme Antworten!

          Comment


          • #6
            public static void main(String[] args) {
            Integer integer = new Integer(5);
            Object o = integer;
            int x = transform(o);
            }
            public static int transform(Object i) {
            return (Integer) i;
            }
            Christian

            Comment


            • #7
              Naja ich eigendlich auch nicht ;-) . Ne nun mal Spaß bei Seite.

              Also ich habe für mein Beispiel 4 Transformer Methoden

              Code:
              public int transform(Integer i){
              	return i.intValue();
              }
              
              public long transform(Long l){
              	return l.longValue();
              }
              
              public float transform(Float f){
              	return f.floatValue();
              }
              
              public double transform(Double d){
              	return d.doubleValue();
              }
              Um aus meinem Array diese Methoden aufzurufen bräuchte ich wieder ein Explizites Cast

              Also

              Code:
              transform((Integer) var[0].getValue());
              
              oder
              
              transform((Long) var[1].getValue());
              
              oder
              
              transform((Float) var[2].getValue());
              
              oder
              
              transform((Double) var[4].getValue());
              da bin ich wieder beim gleichen Problem. Was ich bräuchte ist ein automatischer Caster. Im Sinne von

              Code:
              transform((var[4].getClass()) var[4].getValue());
              AlexDgG

              Es gibt keine dummen Fragen. Nur dumme Antworten!

              Comment


              • #8
                Siehe geänderten Beitrag 6
                Christian

                Comment


                • #9
                  Ne das Beispiel

                  Code:
                  transform((var[4].getClass()) var[4].getValue());
                  Funktioniert so nicht.

                  Ich erkläre es mal anders


                  Also die Basisklasse AbstractVar hat eine Abstracte Methode
                  Code:
                  public abstract Class getVarClass();
                  Abgeleiteten Klassen IntVar, LongVar, FloatVar und DoubleVar implementieren diese Methode

                  Mit z.B. für IntVar

                  Code:
                  public Class getVarClass(){
                  	return Class.forName(„java.lang.Integer“);
                  }
                  Usw…

                  Dann sähe das letzte Beispiel mit dem automatischen Caster so aus

                  Code:
                  transform((var[4].getVarClass()) var[4].getValue());
                  AlexDgG

                  Es gibt keine dummen Fragen. Nur dumme Antworten!

                  Comment


                  • #10
                    Dein Beitrag 5 sah noch anders aus und damit funktioniert das Beispiel, da jede transform Methode ein Object erwartet und dann in den abgeleiteten Klassen den jeweiligen prim. Typ zurückgibt
                    Christian

                    Comment


                    • #11
                      Geänderte Beitrag 6 fünktioniert nicht, da ich die Methode nicht nur für Integer brauch sonder für alle primitiven Datentypen also kann ich nicht Object als Parameterliste verwenden.
                      AlexDgG

                      Es gibt keine dummen Fragen. Nur dumme Antworten!

                      Comment


                      • #12
                        Wenn du meinst....kann ich zwar nicht nachvollziehen....

                        Du hast die transform-Routine in jeder deiner abgeleiteten Klassen. Beitrag 6 war nur ein Beispiel für die transform die in IntVar rein müsste...
                        Christian

                        Comment


                        • #13
                          Ja, wenn ich diese aber in meinen Array

                          Code:
                          AbstractVar[] var = new AbstractVar[4];
                              var[0] = new IntVar();
                              var[1] = new LongVar();
                              var[2] = new FloatVar();
                              var[3] = new DoubleVar();
                          verarbeite muss ich ja wieder explizit casten.

                          Was ich will ist, dass nicht nur zur Laufzeit gecastet wird sondern auch automatisch ZUR LAUFZEIT entschieden wird in was gecastet wird ohne, dass ich dies im Quelltext explizit angebe (je nach Typ der Variabeln). Also ich suche einen Weg die Typenstrengheit von Java zu umgehen. um mit meinen Variabeln vernünftig mathematische Operationen durchzuführen.

                          Im Sinne von

                          Code:
                          var[0].getValue()+var[1].getValue();
                          Und nicht

                          Code:
                          ((int)var[0].getValue())+((long)var[1].getValue());
                          Da ich ja vor dem Kompilieren nicht weis ob var[0] eine int, long, float oder double ist.
                          AlexDgG

                          Es gibt keine dummen Fragen. Nur dumme Antworten!

                          Comment


                          • #14
                            Wo müsstest du explizit casten?

                            Jede abgeleitete Klasse hat die Transform-Methode. Diese wandelt indivduell das über GetValue aus der abstrakten Klasse gelieferte Object in den prim. Typ der Klasse um. Ja, die Methode castet (irgender muss das irgendwann mal machen)

                            Aber du kannst das noch auf x-weitere Methoden auslagern (man könnte das auch in get Value regeln), an der Regel "Keine Änderung des Rückgabtyps" kommst du nicht vorbei und somit ist eine "abstrakte" Implementierung nicht möglich. Ev. git es noch eine Möglichkeit mit Reflections.....
                            Christian

                            Comment


                            • #15
                              Da sind wir ja wieder beim Problem, das ich primitive Datentypen als Rückgabewert in der Methode transform() nicht ändern kann. Also wenn ich diese in der Basisklasse Abstrakt wie public abstract int transform(Object o); hinterlege, dann kann ich dies in DoubleVar nicht nach public double transform(Object o) ändern. Und das ist aber die einzige Möglichkeit über die BasisKlasse auf die Methode zuzugreifen.
                              AlexDgG

                              Es gibt keine dummen Fragen. Nur dumme Antworten!

                              Comment

                              Working...
                              X