【发布时间】:2018-08-14 09:52:21
【问题描述】:
我正在尝试在 MATLAB 2017b 中创建一个类似于 Line 对象类的类,但析构函数存在问题。我想与其他图形对象实现类似的行为,当删除句柄时不再引用该对象,如下例所示:
>> l1 = line([0 1], [0 1]);
如果包含行 l1 的图窗现在已关闭,则变量显示 l1 正在引用已删除的对象:
>> l1
l1 =
handle to deleted Line
我创建了以下类:
classdef circle < handle ...
& matlab.mixin.CustomDisplay & matlab.mixin.SetGet
properties
Center = [];
Color = [0 0.4470 0.7410];
Radius = [];
end
properties (SetAccess = 'protected')
LineHandle = [];
end
methods
function obj = circle(radius, center, varargin)
if nargin > 0
% assign property values
obj.Radius = radius;
obj.Center = center;
% generate plotting variables
phi = linspace(0, 2*pi, 90);
x = radius*cos(phi) + center(1);
y = radius*sin(phi) + center(2);
% draw circle
obj.LineHandle = line(x, y);
% create listeners in line object
obj.createListener;
% set variable properties
for k = 1:2:length(varargin)
% set superclass properties
if (isprop(obj.LineHandle, varargin{k}))
set(obj.LineHandle, varargin{k},varargin{k+1});
if (isprop(obj, varargin{k}))
set(obj, varargin{k}, varargin{k+1});
end
end
end
end
end
% listener to invoke delete if line is closed
function createListener(obj)
set(obj.LineHandle,'DeleteFcn',...
@obj.delete);
end
function delete(obj,varargin)
disp('deleted')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% command to delete class ???
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
end
end
如果包含圆对象的图形是闭合的,则删除线,但圆对象仍然存在。有没有办法同时删除对圆对象的引用?
【问题讨论】:
-
如果您检查已删除行的
class(l1),它仍然是一个 Line 对象实例 (matlab.graphics.primitive.Line)。我怀疑对象的内部标志(例如隐藏属性)将其标记为已删除。你可以在你的类中维护这样一个标志(并在.delete方法中设置它)。我看到你已经从matlab.mixin.CustomDisplay派生了你的类,所以在这种情况下,你只需要为你的 circle 类定义getHeader、getPropertyGroups和getFooter方法。getHeader是否返回“句柄删除的圈子”,而 PropertyGroups 或页脚没有? -
定义
isvalid()删除后返回0也有帮助? -
我为
getHeade、getPropertyGroups和getFooter定义了方法,它们运行良好。但是我怎样才能让isvalid在被删除后返回0?我试图实现一个方法,但得到以下错误Method 'isvalid' in class 'circle' conflicts with the Sealed method from the superclass definition in 'handle'.
标签: matlab graphics matlab-figure matlab-class