Доступ к объекту изнутри объекта - PullRequest
0 голосов
/ 30 октября 2018

Я создал объект 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 голосов
/ 30 октября 2018

Я не вижу необходимости наследования здесь.

Наиболее близким решением для вашего текущего кода будет что-то вроде этого:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...