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

1 visualizzazione (ultimi 30 giorni)
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.

Risposta accettata

chrisw23
chrisw23 il 13 Feb 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 Commenti
chrisw23
chrisw23 il 14 Feb 2023
Modificato: chrisw23 il 14 Feb 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 il 14 Feb 2023
Modificato: lazymatlab il 14 Feb 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.

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Software Development Tools in Help Center e File Exchange

Prodotti


Release

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by