从对象中访问对象

  • 本文关键字:对象 访问 matlab
  • 更新时间 :
  • 英文 :


我创建了一个TestData对象,多个文件使用该对象以特定格式放置数据。这是类(精简版(:

classdef TestData
properties
metaData  = [];  % stores meta data in Nx2 array
end
methods
%% Getters    
%Meta-Data
function metaData = get.metaData(this)
metaData = this.metaData; 
end    
%% Setters
%Meta-data
function this = set.metaData(this, metaData)
this.metaData = metaData;
end
end %methods
end %class

其中一个可以访问它的文件是我的FileIO对象。这可以处理存在外部文件而不是原始数据的情况。我似乎遇到的问题是两个对象之间的接口。我的意图是能够使用FileIO中的readDataFromFile函数读取文件;组织CCD_ 5对象内部的数据;然后将该数据传递给TestData对象,在那里可以对其进行梳理以进行最终验证,然后将其写入单独的外部文件。

classdef FileIO < TestData
methods
function this = readDataFromFile(this, thisFile)
[filepath, name, ext] = fileparts(thisFile);  
inFile = textread(thisFile, '%s', 'delimiter', 'n');
this = this.setMetaDataFromFile(inFile, ext);
myTestData = TestData;
myTestData.metaData = this;    
end %readDataFromFile        
function this = setMetaDataFromFile(this, inFile, ext)
strForm = string(inFile);
if strcmp(ext, '.txt')
dataBegin = find(~cellfun(@isempty, strfind(inFile, 'start of data')));
metaDataBegin = find(~cellfun(@isempty, strfind(inFile, 'meta data')));
metaDataOutForm = strForm(metaDataBegin+1:dataBegin-4);
metaDataOutForm = cellfun(@(x)strsplit (x, '='), metaDataOutForm, 'UniformOutput', false);
this.metaData = cat(1,metaDataOutForm{:});
end
end
end % Methods
end % Class

我尝试了继承,但我已经为此绞尽脑汁了一段时间,我似乎无法找到解决方案。我可以从其他不是classes的文件中毫无问题地做到这一点,这就是为什么我认为这与试图交互的两个对象有关。我创建TestData实例的那行和它正下方的那行只是我尝试解决这个问题的众多尝试之一。

感谢您提前提供的帮助。如果我还有什么可以提供的,请告诉我。

我认为这里没有继承的必要。

最接近您当前代码的解决方案是这样的:

classdef FileIO
properties
metaData  = [];  % stores meta data in Nx2 array
end
methods
function myTestData = readDataFromFile(this, thisFile)
[filepath, name, ext] = fileparts(thisFile);
inFile = textread(thisFile, '%s', 'delimiter', 'n');
this = this.setMetaDataFromFile(inFile, ext);
myTestData = TestData;
myTestData.metaData = this.metaData;
end %readDataFromFile        
function this = setMetaDataFromFile(this, inFile, ext)
% ...
end
end % Methods
end % Class

这里,FileIO.readDataFromFile返回一个TestData对象。你会写:

myFileIO = FileIO;
myTestData = myFileIO.readDataFromFile('filename');

但我认为这是对类的一种非常丑陋的使用,如果你创建了一个对象,调用其中的一个函数,然后再也不使用这个对象,这意味着你需要一个免费的函数:

function myTestData = readDataFromFile(this, thisFile)
[filepath, name, ext] = fileparts(thisFile);
inFile = textread(thisFile, '%s', 'delimiter', 'n');
metaData = getMetaDataFromFile(inFile, ext);
myTestData = TestData;
myTestData.metaData = metaData;
function metaData = getMetaDataFromFile(inFile, ext)
% ...

这里,getMetaDataFromFile是一个私有函数(假设您不需要单独调用它(。现在你只需要:

myTestData = readDataFromFile('filename');

请注意,免费函数版本更容易调用(不需要创建一个你并不真正使用的对象(,而且它的代码更短,因为它周围没有classdef


另一种选择是使readDataFromFile成为TestData类的方法。注意,您可以简单地将我们在上面创建的函数移动到目录@TestData中,使其成为一个方法,它不需要写在classdef文件中。

相关内容

  • 没有找到相关文章

最新更新