I want to turn on/off dependency of two class properties based on the third property.

3 visualizaciones (últimos 30 días)
I made a class "rect" for rectangle, with independent properties width, height and fix_aspect_ratio.
What I want to do is:
  • If fix_aspect_ratio is 0, width and height are independently modifiable.
  • If fix_aspect_ratio is 1, height/width should be maintained. When I change width, height should be modified to keep the ratio, and vise versa.
What I wrote:
classdef rect < handle
properties
width (1,1) double {mustBePositive} = 1
height (1,1) double {mustBePositive} = 1
fix_aspect_ratio (1,1) logical = 0
end
methods
function obj = rect(width, height, fix_aspect_ratio)
arguments
width (1,1) double {mustBePositive} = 3
height (1,1) double {mustBePositive} = 4
fix_aspect_ratio (1,1) logical = 0
end
obj.width = width;
obj.height = height;
obj.fix_aspect_ratio = fix_aspect_ratio;
end
function set.width(obj, width)
if obj.fix_aspect_ratio
obj.height = obj.height * width/obj.width;
end
obj.width = width;
end
function set.height(obj, height)
if obj.fix_aspect_ratio
obj.width = obj.width * height/obj.height;
end
obj.height = height;
end
end
end
Problem:
  • When I try to change width, set.height is called, in which set.width is called, ... I get Maximum recursion error
  • When I try to change height, same thing.
Can I get any solution?
Thank you.
Kang.

Respuesta aceptada

chrisw23
chrisw23 el 13 de Feb. de 2023
Save the listener handles as private properties and use the listeners 'Enabled' property to turn on/off the dependency as needed.
i.e.
obj.listenerObservedProp = addlistener(obj,'ObservedProp'...
obj.listenerObservedProp.Enabled = false
  3 comentarios
chrisw23
chrisw23 el 14 de Feb. de 2023
Editada: chrisw23 el 14 de Feb. de 2023
why static ?
methods (private)
function propChange(obj,metaProp, eventData)
...
would give you access via obj and saving obj.lastPropVal should not be a problem using the prop set/get methods.
lazymatlab
lazymatlab el 14 de Feb. de 2023
Editada: lazymatlab el 14 de Feb. de 2023
Thank you.
Solved by adding private properties for width and height.
Here is my new code:
classdef rect < handle
properties (Dependent)
width
height
end
properties
fix_aspect_ratio (1,1) logical = 0
end
properties (Access = private)
p_width
p_height
end
methods
function obj = rect(width, height, fix_aspect_ratio)
arguments
width (1,1) double {mustBePositive} = 3
height (1,1) double {mustBePositive} = 4
fix_aspect_ratio (1,1) logical = 0
end
obj.p_width = width;
obj.p_height = height;
obj.fix_aspect_ratio = fix_aspect_ratio;
end
function width = get.width(obj)
width = obj.p_width;
end
function height = get.height(obj)
height = obj.p_height;
end
function set.width(obj, width)
if obj.fix_aspect_ratio
obj.p_height = obj.p_height * width/obj.p_width;
end
obj.p_width = width;
end
function set.height(obj, height)
if obj.fix_aspect_ratio
obj.p_width = obj.p_width * height/obj.p_height;
end
obj.p_height = height;
end
end
end
Your suggestion was helpful by the way.
Thank you.
Kang.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Numeric Types en Help Center y File Exchange.

Productos


Versión

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by