2017-01-01 80 views
0

我想要继承内置的控件,如axes;但是,就我所知,MATLAB不允许以这种方式通过文档记录的方式。为了解决这个问题,我创建了一个名为MyAxes的类,如下所示。执行属性获取方法时执行的构造函数

MyAxes具有称为MATLABAxes一项所定义的属性,其存储一个matlab.graphics.axis.Axes对象。该轴对象在构造时创建。将每个轴属性动态添加到正在构建的MyAxes对象中,创建应简单重定向到MATLABAxes属性的包装属性。

每个包装属性的get方法被设置为一个方法MyAxes,称为get_axes_property。这个方法有三个参数:

  1. MyAxes对象本身
  2. 到轴参考控制
  3. 属性名

这种方法效果很好,只是它会为每一个新的坐标轴属性。我结束了一个有131个孩子轴的人物!这似乎是因为在MyAxes构造函数中创建轴而发生的。解决此问题的方法是要求首先创建MATLAB轴并将其作为参数传递给构造函数。这很不方便。

如何在不创建多个轴的情况下在MyAxes构造函数中维护轴创建?当然,如果我的方式偏离轨道,并且有更好的方法来分类内置控件,我很乐意听到它。

classdef Axes < handle & dynamicprops 

    properties 
     MATLABAxes; 
    end 

    methods 

     function obj = Axes 
      obj.MATLABAxes = axes; 
      axesPropertyList = properties(obj.MATLABAxes); 
      for property = axesPropertyList(:)' 
       propertyName = property{1}; 
       obj.addprop(propertyName); 
       propertyInstance = obj.findprop(propertyName); 
       propertyInstance.GetMethod = @(x,y)obj.get_axes_property(obj.MATLABAxes, propertyName); 
      end 
     end 

     function value = get_axes_property(obj, control, propertyName) 
      value = control.(propertyName); 
     end 

    end 

end 

回答

0

是否再次 - 在写问题时回答了我自己的问题。这是一个拼写错误。我已将函数句柄定义中的get_axes_property方法的第一个参数设置为axes而不是obj.MATLABAxes。每次获得一个属性时,这个函数都会执行axes函数。问题中的代码现在已修复。