2015-08-17 69 views
1

我正在寫一些Matlab代碼來加載特定文件格式的數據,以便我可以以統一的方式處理加載的數據。Matlab抽象子類意外的行爲

因此,我想用每個可能的文件格式的唯一子類使用抽象類來表示數據。

我的方案的核心是從文件(實現的唯一位)獲取數據的方法,或者如果數據已經加載,則只是將其吐出。即一種懶加載系統,因爲從磁盤獲取數據可能會很慢...

我想建立一個抽象類,在我的Matlab程序如下所示:

classdef TCSPCImageData 

properties (SetAccess = protected) 
    % The same for all subclasses. 
    frameindex = -1; 
    framedata = ''; 
    ... 
end 

properties (Abstract, SetAccess = protected) 

    % Needs to be set by subclass 
    type 
end 

methods 
    % Constructor. Code omitted for brevity 
    function obj = TCSPCImageData(path) 
     ... 
    end 

    function data = frame(obj, idx, tshift) 
     % Some shared functionality. 
     if (obj.frameindex == idx) 
      ... 
     else 
      % Call a specific subclass method. 
      data = obj.getframe(idx,tshift); 
     end 
    end 

end 

methods (Abstract, Access = protected) 
    % The abstract method that will be implemented by each subclass. 
    getframe(obj, idx, tshift) 
end 
end 

因此,在總結,有一種方法在我的超類中具有所有子類應共享的功能,但在該方法中,我調用了每個子類所特有的特定實現。

然後一個子類看起來是這樣的:

classdef PTUImageData < Data.TCSPCImageData 

properties (SetAccess = protected) 

    % Specific initialisation of this variable 
    type = 'PTU'; 

end 

methods 

    % We call the superclass constructor. 
    function obj = PTUImageData(path) 

     [email protected](path); 

    end 

    % Apparently, you need to call the superclass method. 
    function data = frame(obj, idx, tshift) 
     data = [email protected](obj, idx, tshift); 
    end 

end 

methods(Access = protected) 

    % The specific implementation. 
    function data = getframe(obj, idx, tshift) 

     obj.framedata = 'some value'; 

    end 

end 
end 

天真,我想這應該很好地工作。

obj.framedata = 'some value';只更新子類範圍內的變量。運行此代碼,像這樣當值不保持:

testdata = Data.PTUImageData('somepath'); 
testdata.frame(1,1); 

設置斷點內部的子類顯示obj.framedata獲取設置,但如果我檢查我的TESTDATA對象以後,testdata.framedata將是空的,這完全是意外。

誰能告訴我我的方式錯誤?

編輯

正如下面的回答說,沒有必要顯式調用frame功能:

classdef PTUImageData < Data.TCSPCImageData 

    properties (SetAccess = protected) 

     % Specific initialisation of this variable 
     type = 'PTU'; 

    end 

    methods 

     % We call the superclass constructor. 
     function obj = PTUImageData(path) 

     [email protected](path); 

     end 

    end 

    methods(Access = protected) 

    % The specific implementation. 
    function data = getframe(obj, idx, tshift) 

     obj.framedata = 'some value'; 

    end 

end 
end 

回答

1

你需要讓你的TCSPCImageData一個手柄類,通過繼承來自handle

classdef TCSPCImageData < handle 

請參閱documentation以獲取有關句柄類的更多信息。

默認值是一類是一個類,這意味着它將具有通按值行爲。換句話說,他們會像普通數字數組:

>> a = 2; 
>> b = a; 
>> a = 3; 
>> b 
b = 
    2 

注意b當你改變a並沒有改變,因爲b複製的a,而不是一個參考a本身。他們有傳遞價值的行爲。

在另一方面,其他一些變量(如MATLAB圖形變量)是手柄變量,並有傳遞通過引用行爲:

>> a = figure; 
>> get(a,'Name') 
ans = 
    '' 
>> b = a; 
>> get(b,'Name') 
ans = 
    '' 
>> set(a,'Name', 'hello') 
>> get(b,'Name') 
ans = 
hello 

注意的b的屬性更改當您更改a的屬性時,因爲b是對a的引用,而不是其副本。他們有通過引用行爲。

默認情況下,MATLAB類具有價值行爲。你從handle繼承他們處理行爲。

PS我很確定你不應該需要在子類PTUImageData中實現方法frame;它應該繼承TCSPCImageData的實現。

+0

*一分錢下降的聲音*認爲我實際上知道By Value和By Ref,因爲這也與C#有關: - /我想我太滑稽了,有趣的Matlab語法。非常感謝! – Kris

+0

另外值得注意的是:當你剛剛添加 Kris

+0

而且你對「框架」功能也是正確的。它會自動繼承,這似乎是合乎邏輯的... – Kris