我创建了一个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
文件中。