dynamicprops
Classe de base pour objets handle avec proprietes dynamiques d'instance.
📝Syntaxe
classdef ClassName < dynamicprops
descriptor = addprop(obj, name)
obj = rmprop(obj, name)
📥Arguments d'entrée
Paramètre Description
obj un objet handle classdef scalaire qui herite de dynamicprops.
name nom de propriete dynamique sous forme de vecteur de caracteres ou de chaine scalaire.
📤Arguments de sortie
Paramètre Description
descriptor descripteur handle de propriete dynamique.
obj le meme objet handle apres suppression de la propriete dynamique.
📄Description

dynamicprops est une classe de base classdef pour les classes handle qui ajoutent des proprietes a des instances individuelles pendant l'execution.

addprop(obj, name) ajoute une propriete dynamique a un objet. La propriete peut ensuite etre lue et ecrite avec l'acces par champ, par exemple obj.X.

rmprop(obj, name) supprime une propriete dynamique d'un objet. Les proprietes declarees par la classe ne peuvent pas etre supprimees avec rmprop.

Les proprietes dynamiques sont visibles via isprop, properties, l'acces par champ d'objet, metaclass et la conversion struct.

Le descripteur renvoye par addprop est un handle meta.DynamicProperty avec les champs Name, DefiningClass, Dynamic, Dependent, AbortSet, GetMethod, GetObservable, Hidden, NonCopyable, SetMethod, SetObservable, Transient, GetAccess, SetAccess et ValidationExpression.

AbortSet, Dependent, GetAccess, GetMethod, GetObservable, Hidden, NonCopyable, SetAccess, SetMethod, SetObservable, Transient et ValidationExpression peuvent etre modifies sur le descripteur. GetAccess et SetAccess acceptent public, private ou protected. GetMethod doit etre vide ou un handle de fonction appele comme value = f(obj). SetMethod doit etre vide ou un handle de fonction appele comme f(obj, value). Les proprietes dynamiques dependantes utilisent GetMethod et SetMethod au lieu de valeurs stockees. ValidationExpression utilise la meme syntaxe de validation que les proprietes declarees. Les proprietes dynamiques masquees restent accessibles par champ et via isprop, mais sont omises de properties. Les proprietes dynamiques non copiables sont omises par copy. Les proprietes dynamiques transitoires sont omises de la conversion struct et des donnees d'objet sauvegardees.

GetObservable active les listeners PreGet et PostGet pour la propriete dynamique. SetObservable active les listeners PreSet et PostSet. AbortSet evite les notifications de modification lorsque la valeur assignee est inchangee.

Les objets qui heritent de dynamicprops emettent PropertyAdded apres l'ajout d'une propriete dynamique et PropertyRemoved avant sa suppression. Les donnees d'evenement contiennent Source, EventName et PropertyName.

La suppression du descripteur avec delete(descriptor) supprime la propriete dynamique de l'objet source.

💡Exemples
Ajouter et supprimer une propriete dynamique.
d = [tempdir(), 'nelson_help_dynamicprops/'];
if ~isdir(d)
  mkdir(d);
end
filewrite([d, '/NelsonHelpDynamicProps.m'], ["classdef NelsonHelpDynamicProps < dynamicprops"; "  properties"; "    Base = 1"; "  end"; "end"]);
addpath(d);
obj = NelsonHelpDynamicProps();
listenerAdded = addlistener(obj, 'PropertyAdded', @(src, eventData) disp(eventData.PropertyName));
listenerRemoved = addlistener(obj, 'PropertyRemoved', @(src, eventData) disp(eventData.PropertyName));
descriptor = addprop(obj, 'Extra');
obj.Extra = 42;
descriptor.Name
descriptor.Dynamic
descriptor.SetObservable = true;
setListener = addlistener(obj, 'Extra', 'PostSet', @(src, eventData) disp(eventData.PropertyName));
obj.Extra = 43;
descriptor.GetMethod = @(x) x.Base + 10;
obj.Extra
descriptor.GetMethod = [];
descriptor.Dependent = true;
descriptor.SetMethod = @(x, value) value;
descriptor.GetMethod = @(x) x.Base;
obj.Extra = 3;
obj.Extra
descriptor.Dependent = false;
descriptor.GetMethod = [];
descriptor.SetMethod = [];
descriptor.SetAccess = 'private';
descriptor.SetAccess = 'public';
descriptor.ValidationExpression = '(1, 1) double {mustBePositive}';
descriptor.NonCopyable = true;
descriptor.Hidden = true;
isprop(obj, 'Extra')
properties(obj)
descriptor.Hidden = false;
descriptor.Transient = true;
struct(obj)
delete(descriptor);
delete(listenerAdded);
delete(listenerRemoved);
delete(setListener);
isprop(obj, 'Extra')
clear obj descriptor;
rmpath(d);
rmdir(d, 's')
🔗Voir aussi
classdefisproppropertiesmetaclass
🕔Historique des versions
Version Description
2.0.0 version initiale
Modifier cette page sur GitHub