【问题标题】:Get Object name as string MATLAB获取对象名称作为字符串 MATLAB
【发布时间】:2020-12-11 10:21:46
【问题描述】:

我想找到一种方法在 MATLAB 中获取对象实例的名称,并在 MATLAB R2019b 中将其返回。

所以在 Launcher 构造函数中定义这样的实例

Properties
    TorqueViewComponent
    SpeedViewComponent
end

methods
    function obj = Launcher()
        TorqueViewComponent = GraphView(args...);
        SpeedViewComponent = GraphView(args...);
    end
end

然后在图形视图对象构造函数中类似于

function obj = GraphView(args...)
    if strcmp(object name, 'TorqueViewComponent')
        do some things;
    elseif strcmp(object name, 'SpeedViewComponent')
        do some other things;
    end
end

本质上,我有多个 GraphView 对象实例,我想根据实例名称绘制不同的数据集。

如果您有任何问题,请告诉我,我可以更详细地解决问题

【问题讨论】:

  • 即使有,这也是非常糟糕的设计。您最好将名称作为参数传递。更不用说,如果你真的想让你的 GraphView 类做两个不同的事情,那么它应该是两个不同的类(如果你想要一个接口,你可以将它们包装在一个“调度程序”类中)。看看SOLID principle
  • “做一些事情”和“做一些其他事情”部分可能有点误导,做不同的事情只是意味着正在绘制 ylabel、title 和 y 轴数据,这些图表是除此之外,被创建是相同的。所以例如做一些事情是 ylabel(obj.Axes, 'Torque [Nm]');标题(“扭矩”);然后做一些其他的事情是 ylabel(obj.Axes, 'Speed [rpm]');标题('速度');。

标签: matlab oop


【解决方案1】:

你真的只有两个选择;子类 Graphview 以创建专门的子类,或传递额外的输入参数。 可能有一些 hacky 解决方案可以让您以某种方式从调用者工作区获取名称,但这不太可能提高代码的可读性和可维护性。

子类化

例如

classdef TorqueGraphView < GraphView
   methods
      function obj = TorqueGraphView(varargin)
         obj@SuperClass(varargin);
         ...
      end
   end
end

事实上,如果你真的不需要向 TorqueGraphView 传递额外的参数,你可以利用这个事实,你可以创建一个Implicit Call to Inherited Constructor

classdef TorqueGraphView < GraphView
    % ... no constructor, only Torque-specific methods here
end

显式输入参数

否则,如果您认为对于如此小的调整来说这太过分了,那么您真的必须传递一个参数来表明这一点。如果您主要关心的是“混乱”,您可以考虑将您的论点打包成一个结构,这样看起来更整洁一些。这甚至可以帮助您很好地将特定于对象的参数与通用/选项相关的参数分开,例如

TorqueArgs = struct(                  ...
    'type'        ,   'torque'      , ...
    'initialvalue',   0             , ...
    'ylabel'      ,   'Torque [Nm]' , ...
    'plottitle'   ,   'Torque'        )

GraphOpts = struct (      ...
    'axescolor',   'k'  , ...
    'linewidth',   3,   , ...
    'grid'     ,   'on'   )

TorqueViewComponent = GraphView( TorqueArgs, GraphOpts );

【讨论】:

  • 感谢 Tasos,我已经解决了这个问题,只需将一个附加参数传递给 GraphView 类,该参数只是“扭矩”或“速度”的字符串,然后 GraphView 类绘制正确的数据关于那个论点是什么。一个结构可以在那里工作,但我不愿意这样做只是为了保持顶级启动器整洁,我认为真正更清洁的解决方法是重新处理应用程序的其他一些区域,但这有点超出了我原来的问题的范围
【解决方案2】:

您在 cmets 中补充说,这是为了影响情节的 ylabel 之类的东西。

您可以使用inputname 来解决这个问题,但您必须将函数拆分出来,因为需要先定义变量。

function ylabelVarName( v )
    ylabel( inputname(1) )
end

然后

function obj = Launcher()
    TorqueViewComponent = GraphView(args...);
    ylabelVarName( TorqueViewComponent );
    SpeedViewComponent = GraphView(args...); 
    ylabelVarName( SpeedViewComponent );
end

您可能可以将这部分作为GraphView 类的一部分,但我看不出您将如何在两行中完成它。


确实,我认为正确的答案是只为您的 GraphView 函数使用一个额外的输入参数,该参数指定您在轴标签等方面的偏好。

【讨论】:

  • 是的,我开始尝试用参数来做,但发现我需要传递给对象的参数数量很乱,也就是说我可以通过传递来绕过它一个“类型”参数,然后如果满意地说“速度”,那么 GraphView 在内部设置标题和 ylabel
猜你喜欢
  • 2013-09-30
  • 2012-08-09
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
相关资源
最近更新 更多