我正在寫一些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
*一分錢下降的聲音*認爲我實際上知道By Value和By Ref,因爲這也與C#有關: - /我想我太滑稽了,有趣的Matlab語法。非常感謝! – Kris
另外值得注意的是:當你剛剛添加
Kris
而且你對「框架」功能也是正確的。它會自動繼承,這似乎是合乎邏輯的... – Kris