Using builtin assignment for classes that overload the assignment operator '='
5 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Daniel
am 5 Apr. 2015
Kommentiert: Daniel
am 20 Apr. 2015
Hi,
I'm trying to find out if it is possible to recover the functionality of '=' for properties in a class that have their own set method.
For instance, this piece of code:
classdef myClass < hgsetget
properties
myProperty
end
methods
function set.myProperty(obj,value)
mySetFunction(obj,value);
end
function mySetFunction(obj,value)
obj.myProperty = value;
end
end
end
generates a recursion error if we try to set the property myProperty by any value.
Is there a way to avoid this effect? If there were a builtin function that represents the effect of the "=" I could use it inside mySetFunction, but I do not know if this is possible.
In other words, I know that inside the set.myProperty function, a command
obj.myProperty = value;
would call the builtin function corresponding to "=", but I do not know how to force this behaviour explicitely in any function that is not a set.<property>
Best, Daniel
0 Kommentare
Akzeptierte Antwort
Philip Caplan
am 13 Apr. 2015
You are correct, your code does throw an error about recursion limits. However, I believe the operator you are interested in overloading is the subscripted assignment operator, "subsasgn". This will allow you to do:
obj.myProperty = value;
and call you own set function without receiving an error about the recursion limit. Here is what the class definition would look like:
classdef myClass < hgsetget
properties
myProperty
end
methods
function mySetFunction(obj,value)
obj.myProperty = value;
end
function a = subsasgn(a,s,b)
if strcmp(s.subs,'myProperty')
mySetFunction(a,b);
end
end
end
end
3 Kommentare
Philip Caplan
am 15 Apr. 2015
The only way I can think of achieving this is by adding an additional property to the class:
classdef myClass < hgsetget
properties
myProperty
printMessage
end
methods
function mySetFunction(obj,value)
if (obj.printMessage)
disp('myProperty has been updated');
end
obj.myProperty = value;
end
function a = subsasgn(a,s,b)
if strcmp(s.subs,'myProperty')
mySetFunction(a,b);
else
a.(s.subs) = b;
end
end
end
end
The message will not print if the property "printMessage" is false (or empty which is the default when creating an instance of the class) but will display the message if this property is true.
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu COM Component Integration finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!