Verbesserung
Top-Thema
Detail
Wichtig
Detail
Wichtig
#26093
Implementierungen berechneter Attribute lassen sich nicht überschreiben
Gegeben seinen zwei konkrete Typen A und B, die beide vom Interface V ableiten. V deklariert ein referenzwertiges Attribut x ohne weitere Implementierung.
x ist an A und B jeweils überschrieben, mit unterschiedlichen Speichervorschriften zur Berechnung der Werte. z.B.
- A.x gibt immer A zurück (Selbstreferenz)
- B.x gibt immer ROOT zurück (oder ein anderes Kontextelement).
Bei der Abfrage von Werten findet das Framework nicht immer korrekt die richtige Konfiguration:
// $x.instanceOf(`A`) == true $x.get(`A.x`) liefert A $x.get(`V.x`) liefert null $x.get(`B.x`) liefert null oder Exception
// $x.instanceOf(`B`) == true $x.get(`A.x`) liefert null oder Exception $x.get(`V.x`) liefert null $x.get(`B.x`) liefert ROOT
Ein Nebeneffekt davon ist, wenn am Typ keine Formulardefinition hinterlegt ist und das Framework auf "weitere Attribute" zurückgreift, dann liefert das Formularfeld für x immer null. Wird hingegen am konkreten Typ eine Formulardefinition angegeben, dann enthält das Formularfeld für x den erwarteten Wert. Das liegt vermutlich daran, dass im Hintergrund das Framework ohne Formulardefinition das Interfaceattribut anfragt, ansonsten das konkrete Attribut.
Test
- Sicht in tl-demo: Technisches Demo:Tests:Überschreibung
- /com.top_logic.demo/src/test/com/top_logic/demo/scripted/model/attribute/override/TestValuesOfOverriddenAttributesInForms.script.xml