2011-08-31 209 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 ...這是一個更原始的問題背後的一般解決方案。 –