Программа в том же стиле OOP, что и дизайнер приложений - PullRequest
0 голосов
/ 19 марта 2020

Мне нравится стиль программирования ОО, который использует Matlabs App Designer (или, по крайней мере, способ, которым я его использую). Теперь мне интересно, смогу ли я использовать тот же стиль в моем "обычном" классе matlab.

Что у меня сейчас есть:

classdef myClass

    properties
        myVar;
    end

    methods
        function Main(obj)
            obj.myVar = "a";
            obj = DoSomething(obj);
            disp(obj.myVar) % outputs "c"
        end

        function obj = DoSomething(obj)
            if(obj.myVar == "a")
                obj.myVar="c";
            else
                obj.myVar = "b";
            end
        end
    end
end

Который можно вызывать извне, используя:

myClassInst = myClass;
myClassInst.Main()

Я хотел бы избавиться от всех «obj =» в classdef, как это возможно в App Designer. Итак, что-то похожее на это:

classdef myClass

    properties
        myVar;
    end

    methods
        function Main(obj)
            obj.myVar = "a";
            DoSomething(obj); % Just call the function without "obj = "
            disp(obj.myVar) % outputs "a" because I didn't overwrite obj
        end

        function DoSomething(obj)
            if(obj.myVar == "a")
                obj.myVar="c";
            else
                obj.myVar = "b";
            end
        end
    end
end

Эквивалент этого, похоже, работает в App Designer. Похоже, что вы можете изменять переменные в классе (экземпляре?) В App Designer, а также иметь возможность доступа к измененной переменной без явной перезаписи вашего старого экземпляра класса.

Я заметил, что в App Designer есть все методы и свойства установите (Access = private), хотя я не уверен, что это как-то связано с этим. Конечно, если я установлю все как private, то я больше не смогу получить доступ к методу Main () извне.

Поэтому мой вопрос, как я могу программировать в "нормальном" matlab, так же, как возможно в App Designer?

РЕДАКТИРОВАТЬ: Следующие работы в App Designer (я пропустил методы / свойства для GUI элементов):

classdef tmp < matlab.apps.AppBase

    properties (Access = private)
        myVar; % Description
    end

    methods (Access = private)

        function doSomething(app)
            if app.myVar == "a"
                app.myVar = "c";
            else
                app.myVar = "b";
            end
        end
    end


    % Callbacks that handle component events
    methods (Access = private)

        % Code that executes after component creation
        function startupFcn(app)
            app.myVar = "a";
            doSomething(app);
            disp(app.myVar); % outputs "c"
        end
    end
end

Ответы [ 2 ]

3 голосов
/ 19 марта 2020

Вы определенно можете! Все, что вам нужно сделать, это наследовать от класса дескриптора, в отличие от класса значений, который используется по умолчанию для matlab. Вы также можете определить private и publi c методы, как и в других языках.

Единственное, что вам нужно сделать, это:

classdef myclass < handle % this is how you inherit from base class
   properties
      public_property
   end

   properties (Access=private)
      private_property
   end

   methods
      function obj = myclass() % class constructor
         ...
      end
      function public_function()
         ...
      end
   end
   methods (Access=private)
      function private_function()
         ...
      end
   end
end

Теперь каждый раз, когда вы передаете объект этого класса функции, вы не передаете ее по значению, вы передаете по ссылке (как вы могли бы привыкнуть к python), и изменение ее свойств изменяет их также в исходном объекте.

2 голосов
/ 19 марта 2020

Вам необходимо унаследовать (< в начале класса) от класса дескриптора

classdef myClass < handle
    properties
        var
    end
    methods
        function obj = myClass( varargin )
            % Constructor function, called automatically when object is created
        end
        function someFunction( obj )
            obj.randomizeVar(); % Equivalent to randomizeVar( obj );
        end
        function randomizeVar( obj )
            obj.var = rand();
        end
    end
end

См. Документацию для различия между "дескриптором" и " value "class:

Конструктор класса значения возвращает объект, связанный с переменной, которой он назначен. Если вы переназначите эту переменную, MATLAB® создаст независимую копию исходного объекта. Если вы передадите эту переменную в функцию для ее изменения, функция должна вернуть измененный объект в качестве выходного аргумента. Для получения информации о поведении класса значений см. Избегайте ненужных копий данных.

Конструктор класса дескриптора возвращает объект дескриптора, который является ссылкой на созданный объект. Вы можете назначить объект дескриптора нескольким переменным или передать его функциям, не заставляя MATLAB сделать копию исходного объекта. Функция, изменяющая объект-дескриптор, переданный в качестве входного аргумента, не должна возвращать объект.

Более того, если вы edit matlab.apps.AppBase, класс, который вы используете для конструктора приложения наследует, вы можете видеть, что первая строка -

classdef AppBase < handle

Таким образом, вы буквально делаете то же самое, без AppBase посредника.

...