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

时间:2011-08-31 17:53:50

标签: oop matlab

假设我有myClass < handle属性A。如果我创建myClass的实例,说myObj,并将myObj.A传递给函数,比如说function myFunc(val),那么在myFunc内是否可以看到传递给它的val属性为myObj

编辑:对于上下文:

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

EDIT2:我正在努力完成的示例代码片段:

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

2 个答案:

答案 0 :(得分:5)

据我所知,不。

例如,如果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替换~

这可行吗?

答案 1 :(得分:2)

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

就个人而言,我认为Vehicle和TelemCollector之间的联系应该是相反的。我更喜欢看起来更像的东西:

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

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

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