Announcement

Collapse
No announcement yet.

Problem bei vererbung ...

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

  • Problem bei vererbung ...

    hallo..

    ich habe hier ein kleines problem wenn ich ein objekt vererben will..

    bsp:

    import...<br>
    public class Input extends JFormattedTextField{<br>
    MaskFormatter Maske = new MaskFormatter();<br>
    public Input(int länge, String Text) throws ParseException{ <br>
    super(); <br>
    // source <br>
    } <br>
    public Input(char C, String Möglich)throws ParseException{ <br>
    super(); <br>
    // source <br>
    // source <br>
    } <br>
    } <br>

    ich überlagere also Input 2 mal..
    ich muss aber Maske auf das Textfeld bringen
    normaler weise schreib ich dann:
    JFormattedTextField Eingabe = new JFormattedTextField(Maske);
    hier in unserem beispiel müsste ich also schreiben super(Maske);
    aber da bekomm ich folgenden fehler:
    Cannot reference Maske before supertype constructor has been called..

  • #2
    Dein Problem ist, daß Du auf die Variable nicht zugreifen kannst, bevor Du den super-Konstruktor aufgerufen hast. Sie ist dann nämlich noch nicht initialisiert. Die einzige Möglichkeit, dem zuvor zu kommen wäre ein static initializer. Der wird noch VOR dem Konstruktor durchgeführt. Dann müßtest Du jedoch mit einer Klassenvariable auskommen. Ich schätze aber, das ist bei Dir nicht gewollt.

    Du kannst natürlich die Objekterzeugung direkt in den super-Konstruktor eintragen: super(new MaskFormatter()). Dann hast Du allerdings keine Referenz auf diesen Formatter. Wenn Du diese Referenz brauchst, geht auch diese Lösung nicht.

    Du kannst den Formatter als Parameter dem Konstruktor übergeben. In diesem steht dann super(formatter).

    Dritter Vorschlag:
    Du schreibst (privaten) einen Konstruktor mit dem Formatter als Parameter, der super(formatter) aufruft. Dann schreibst Du eine statische Factory-Methode, die zuerst den MaskFormatter erzeugt und dann den (privaten) Konstruktor mit dem Formatter als Parameter aufruft.
    Ist der Konstruktor privat, hast Du die absolute Kontrolle darüber, mit was für einem Formatter das Objekt erzeugt wird, weil nur Deine Factory-Methode dies tut. Allerdings kannst Du keine Unterklasse von dieser Klasse mehr bilden.

    Ich würde es mit dem Vorschlag 3 machen

    Comment


    • #3
      Hallo,

      Stefans Vorschlag Nr 3 hätte ich auch gesagt.
      Allerdings gibt es da noch andere Möglichkeiten:

      - Du benutzt Stefan(1) und weist Deine eigene Referenz (Maske) auf den formatter dann zu, indem Du Dir ihn vom JFormattedTextField mit getFormatter() holst.

      - Du setzt den Formatter später (nach super()), die Methode setFormatter soll allerdings nicht benutzt werden (??). Man soll statt dessen die Factory setzen. Probier einfach mal. Ich habe leider hier kein JDK 1.4. Die Auswirkungen kenne ich also nicht.
      Wo man die Factory herbekommt, steht da leider nicht, möglich wäre
      (new JFormattedTextField(Maske)).getFormatterFactory(), aber das
      ist nur Spekulation.

      Gruß,

      Kar

      Comment

      Working...
      X