2011-08-31 184 views
0

假设我有一个myClass < handle,并带有属性A。如果我创建了一个myClass的实例,比如说myObj,并将myObj.A传递给一个函数,比如说function myFunc(val),那么myFunc内部是否有可能看到val传递给它的属性是myObjMATLAB - 获取属性所属的对象?

编辑:对于背景:

我正在写一个API(在某种意义上)与Arduino硬件为我的研究实验室接口。总体类别被称为Vehicle,其属性为PinManager < handle,TelemCollector < 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 
+0

我不太明白 - 首先,你说车辆类TelemCollector的属性,并且在你结束你说你是想给TelemCollector型车辆的性能?如果telemFetch()需要访问这两个对象的内部结构,它需要是“外”对象的方法,而不是一个内,使其工作。 –

+0

...也许你可以张贴实际的代码片段,而不是一个文字描述;这会更容易理解...... –

+0

将代码片段添加到OP。我想'telemFetch()'访问'Vehicle'方法;这是可行的,如果'Vehicle'那'TelemCollector'是一个属性是TelemCollector'的'属性。因为一切都是句柄,他们会引用正确的对象实例。当然,我真的不想那样做。 –

回答

5

据我所知,没有。

例如,如果myObj.A是双,myFunc的将只是被传递它所包含的值,并且将有到对象没有引用。如果你打电话myFunc(somevariable)其中somevariable真是一个变量的名称,而不是一个表达式,然后调用inputname(1)myFunc内会给你字符串“somevariable”,但因为你是指一类的属性,这太复杂了对于MATLAB和inputname(1)只是返回''(使用MATLAB R2011a进行测试)。

更新:为什么你需要无论如何知道呢?如果你的界面设计得很干净,你可能不需要做这种事情。或者你是否试图解决别人的错误/糟糕的设计?根据您的应用程序,你可能会认为某种涉及dbstack非常肮脏的黑客的,试图找出其中M-文件调用你的函数,读取代码.m文件相应的行,解析它,然后访问使用evalin('caller',...)对象......但我怀疑这是个好主意;-)。

编辑响应环境下,你提供:

你就不能重新定义你的计时器回调交出“车辆”的对象呢?即

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

意味着每当回调计时器调用函数TelemCollector.fetchTelem(),它移交vehicle_handle作为第三个参数as described in the docu。此作品连同变更的功​​能头

function fetchTelem(obj, event, vehicle_handle) 

在那里你可以通过~在新MATLAB版本替换event如果你不需要它。

莫非这项工作?

+0

您只需将vehicle_handle传递给TelemCollector构造函数,对吧?谢谢您的帮助。在我写给Nzbuu时,我没有实现你的答案,而是稍微改写了界面。很高兴知道这是可行的(虽然不是最漂亮的事情)。人,我希望MATLAB有朋友上课.. –

+0

使用我的解决方案,TelemCollector构造函数不需要车辆把手,只要您将回调设置在可以访问车辆的地方即可。 *回调*然后将车辆交给它。但这是针对你的情况,你说fetchTelem是由定时器调用的,所以如果Nzbuu的解决方案不会给你带来其他问题,那肯定是更通用和同样干净的解决方案:-)。 –

2

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

个人认为车辆和TelemCollector之间的关联应该是在相反的方向。我宁愿看起来更像的东西:

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

虽然它真的取决于你如何使用类。

我同意@Jonas海德堡:如果是这样困难的,那么它可能是错误的接口。

+0

这是我最终选择的路线;我把这个复选标记给Jonas Heidelberg,因为它最好地回答了实际问题,但是从设计的角度来看,它更符合你的方式。我同意,这是一个困难的问题,它需要(d)重新思考我如何将课程放在一起。 –

+0

+1 ...这是一个更原始的问题背后的一般解决方案。 –