Je veux avoir un enregistrement (structure) avec un comportement «polymorphe». Il aura plusieurs domaines utilisés dans tous les cas et je souhaite utiliser d'autres champs que lorsque j'en ai besoin. Je sais que je peux accomplir cela par des pièces variantes déclarées dans des enregistrements. Je ne sais pas s'il est possible qu'au moment de la conception, je ne peux accéder que les éléments dont j'ai besoin. Pour être plus précis, regardez l'exemple ci-dessous est-ce possible? P> p>
3 Réponses :
Tous les champs de variante d'une variante enregistrement sont accessibles à tout moment, quelle que soit la valeur de la balise.
Pour atteindre le contrôle d'accessibilité que vous recherchez, vous devez utiliser des propriétés et avoir des vérifications d'exécution pour contrôler Accessibilité. P>
type TMyRecord = record strict private FIsEnabled: Boolean; FInt: Integer; FStr: string; // ... declare the property getters and settings here public property IsEnabled: Boolean read FIsEnabled write FIsEnabled; property Int: Integer read GetInt write SetInt; property Str: string read GetString write SetString; end; ... function TMyRecord.GetInt: Integer; begin if IsEnabled then Result := FInt else raise EValueNotAvailable.Create('blah blah'); end;
C'est parfaitement correct, mais dans ce cas, je préférerais utiliser une classe au lieu d'un enregistrement. Cela permettra d'ajouter la fonctionnalité d'héritage, ce qui donne un sens ici (par exemple, la propriété est généralement à traiter au niveau des parents et partagés entre les enfants).
L'exemple donné n'est pas un enregistrement de variante, il inclut tous les champs tout le temps. P>
Un vrai enregistrement de variante a les variantes partageant la même mémoire. Vous utilisez simplement le "cas discriminateur de cas: Disctype de ....." Syntaxe, pas besoin d'un champ distinct vous indiquant quelle variante est active. p>
C'est une variante enregistrement. Le cas le rend donc.
Vous parlez de variables absolue b>, qui est une autre chose complètement différente. David a raison, cet IA a une variante.
Il n'inclut pas tous les champs, cela donne à la place accès à toutes les pièces après case code> en même temps i>, et tous partagent la même mémoire. Il est donc similaire à Absolute B> Vars, sauf: il est plus structuré; Vous avez une variable de balise; et, possible, l'alignement de la mémoire est un peu différent
Même si j'ai entendu dire que par la définition Pascal d'origine Niklaus Wirth devrait tout fonctionner comme prévu, je n'ai vu aucun comportement de ce type à Delphi, à partir de son ancêtre, Turbo Pascal 2.0 . Regard sur Freepascal a montré que son comportement < / a> est la même. Comme dit dans
Vous pouvez lire ou écrire dans n'importe quel champ de toute variante à tout moment; Mais si vous écrivez sur un champ en une variante, puis sur un champ d'une autre variante, vous écrasez peut-être vos propres données. La balise, s'il y en a une, fonctionne comme un champ supplémentaire (de type ORDALTALTYPE) dans la partie non variante de l'enregistrement. " P> blockQuote>
En ce qui concerne votre intention, dans la mesure où je l'ai compris, j'utiliserais deux classes différentes, type de p>
xxx pré> de cette façon, vous pouvez obtenir un soutien de Editeur de code de l'IDE, même au moment de la conception. Plus utile, cependant, est que ce sera beaucoup plus facile à modifier et à prendre en charge plus tard. P>
Toutefois, si vous avez besoin de commutation rapide des valeurs variables d'enregistrement au moment de l'exécution, Variante @David Heffernan , utiliser des propriétés et avoir des contrôles d'exécution, est plus raisonnable. p> p>