MATLAB - 获取属性所属的对象?

Posted

技术标签:

【中文标题】MATLAB - 获取属性所属的对象?【英文标题】:MATLAB - obtain the object a property belongs to? 【发布时间】:2011-08-31 17:53:50 【问题描述】:

假设我有一个myClass < handle,其属性为A。如果我创建一个myClass 的实例,比如myObj,并将myObj.A 传递给一个函数,比如function myFunc(val),是否有可能在myFunc 中看到传递给它的val 是一个属性myObj?

编辑:对于上下文:

我正在为我的研究实验室编写一个 API(在某种意义上)来与 Arduino 硬件接口。总体类称为Vehicle,具有PinManager < handleTelemCollector < handle 和各种Device < handles 属性。它还有一些方法可以做runMotor()getAltitude()等。我有一个方法TelemCollector.telemFetch(),它是一个定时器事件的回调;我希望TelemCollector.telemFetch() 能够访问Vehicle 方法(即getAltitude());天真地我只是将Vehicle 设为TelemCollector 的属性来访问这些方法。我希望不必这样做。

EDIT2:我正在尝试完成的示例代码 sn-p:

classdef Vehicle < handle
    properties
        PinManager
        TelemCollector
        Devices
    end
    methods
        function obj = Vehicle(PM, TC, D)
            obj.TC = TelemCollector();
            obj.PM = PinManager();
            obj.Devices = D();
        end 
        function val = getAltitude(obj)
            %# read altitude from a connected Device
        end
        function val = getSpeed(obj)
            %# read speed from connected Device
        end
    end
 end

 classdef TelemCollector < handle
     properties
         %# ...
     end
     methods
         function fetchTelem(obj)
             %# do getAltitude(), getSpeed(), etc, here.. but I want to access
             %# Vehicle.getAltitude() and Vehicle.getSpeed() somehow!
         end
     end
 end

【问题讨论】:

我不太明白 - 首先你说 Vehicle 有一个 TelemCollector 类的属性,最后你说你正在考虑给 TelemCollector 一个 Vehicle 类型的属性?如果 telemFetch() 需要访问两个对象的内部,它需要是“外部”对象的方法,而不是内部对象才能使其工作。 ...也许您可以发布实际代码 sn-p 而不是文字描述;那会更容易理解... 将代码 sn-p 添加到 OP。我想让telemFetch() 访问Vehicle 方法;如果TelemCollector 的属性VehicleTelemCollector 的属性,这是可行的。由于一切都是句柄,它们将引用正确的对象实例。当然,我真的不想那样做。 【参考方案1】:

据我所知,没有。

例如,如果myObj.A 是一个double,myFunc 将只传递它包含的值,并且不会引用该对象。如果你调用myFunc(somevariable),其中somevariable实际上是一个变量的名称而不是一个表达式,那么在myFunc内部调用inputname(1)会给你字符串'somevariable',但是因为你指的是一个属性一个类,这对于 MATLAB 来说太复杂了,inputname(1) 只返回''(用 MATLAB R2011a 测试)。

更新:你为什么需要知道这个?如果您的界面设计简洁,您可能不必做这种事情。或者您是否正在尝试解决其他人的错误/错误设计?根据您的应用程序,您可能会想到一些涉及dbstack 的非常肮脏的黑客攻击,试图找出哪个 m 文件调用了您的函数,从 .m 文件中读取适当的代码行,对其进行解析,然后访问该对象使用evalin('caller',...) ...但我怀疑这是个好主意;-)。

编辑以响应您提供的上下文:

你不能重新定义你的 Timer 回调来交出“Vehicle”对象吗?即

set(yourtimer_handle,'TimerFcn',@fetchTelem,vehicle_handle);

意味着每当回调计时器调用函数 TelemCollector.fetchTelem() 时,它会将 vehicle_handle 作为第三个参数as described in the docu 移交。这与更改的函数头一起使用

function fetchTelem(obj, event, vehicle_handle)

如果您不需要,可以在较新的 MATLAB 版本中将 event 替换为 ~

这行得通吗?

【讨论】:

您只需将 vehicle_handle 传递给 TelemCollector 构造函数,对吗?谢谢您的帮助。当我写信给 Nzbuu 时,我没有实现您的答案,而是稍微重写了界面。很高兴知道这是可行的(尽管不是最漂亮的事情)。伙计,我希望 MATLAB 有朋友课程.. 使用我的解决方案,TelemCollector 构造函数不需要拥有车辆句柄,只要您在可以访问车辆的地方设置回调即可。 回调 将把车辆交给它。但这是特定于您所说的 fetchTelem 由计时器调用的情况,因此,如果 Nzbuu 的解决方案不会给您带来其他问题,那肯定是更通用且同样干净的解决方案:-)。【参考方案2】:

fetchTelem 不能调用它没有引用的对象的方法。因此,无论如何,您都需要为 TelemCollector 对象提供 Vehicle 句柄。

我个人认为 Vehicle 和 TelemCollector 之间的关联应该是相反的方向。我更喜欢看起来更像:

V = Vehicle(PM, D);
TC = TelemCollector(V);

虽然这实际上取决于您希望如何使用这些类。

我同意@Jonas Heidelberg 的观点:如果它这么难,那么它可能是错误的界面。

【讨论】:

这是我最终选择的路线;我给 Jonas Heidelberg 打了勾,因为它最好地回答了实际问题,但从设计的角度来看,你的方式更有意义。我同意,这是一个难题,它需要 (d) 重新考虑我如何将课程组合在一起。 +1 ...这是对原始问题背后的更通用的解决方案。

以上是关于MATLAB - 获取属性所属的对象?的主要内容,如果未能解决你的问题,请参考以下文章

js对象不能访问他所属类的类属性

php中如何找到对象所属的类?

通过UIView对象获取该对象所属的UIViewController(转)

java 反射

反射

java反射