从对象内部访问对象

时间:2018-10-30 00:57:07

标签: 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对象。这可以处理存在外部文件而不是原始数据的情况。我似乎遇到的问题是两个对象之间的接口。我的意图是能够使用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实例的行及其正下方的行只是我尝试解决此问题的许多尝试之一。

谢谢您的帮助。如果还有其他我可以提供的信息,请告诉我。

1 个答案:

答案 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


另一种替代方法是使readDataFromFileTestData类的方法。请注意,您可以简单地将上面创建的函数移动到目录@TestData中,使其成为一种方法,无需将其写入classdef文件中。