我创建了一个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
对象。这可以处理存在外部文件而不是原始数据的情况。我似乎遇到的问题是两个对象之间的接口。我的意图是能够使用readDataFromFile
中的FileIO
函数读取文件;组织FileIO
对象内部的数据;然后将该数据传递到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
实例的行及其正下方的行只是我尝试解决此问题的许多尝试之一。
谢谢您的帮助。如果还有其他我可以提供的信息,请告诉我。
答案 0 :(得分:1)
我认为这里不需要继承。
与您当前代码最接近的解决方案是这样的:
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
文件中。