Метод get по умолчанию, который возвращает указанное c свойство - MATLAB - PullRequest
2 голосов
/ 01 апреля 2020

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

Просто для того, чтобы разместить этот вопрос здесь, класс может выглядеть так this:

classdef Channel < handle
    properties (Access = 'private')
        prvValue, prvUnits;
    end

    properties (Dependent)
        value, units;
    end

    methods
        function this = Channel(value, units)
            this.value = value;
            this.units = units;
        end

        function set.value(this, value)
            this.prvValue = value;
        end

        function out = get.value(this)
            out = this.prvValue;
        end

        function set.units(this, units)
            this.prvUnits = units;
        end

        function out = get.units(this)
            out = this.prvUnits;
        end                  
    end
end

Вы можете создать объект такого класса с чем-то вроде:

> ch1 = Channel([1:10], 'm');

И получить доступ к его зависимым свойствам с помощью:

>> ch1.value

ans =

     1     2     3     4     5     6     7     8     9    10

>> ch1.units

ans =

    'm'

Тем не менее, для этого потребуется изменить каждую строку в унаследованном коде, который обращается к данным, с чего-то вроде «ch1» на «ch1.value».

Теперь мой вопрос: есть ли способ определить своего рода «метод get по умолчанию», который возвращает определенное свойство класса (в данном случае «value»)? Другими словами, что-то, что ведет себя так:

>> ch1

ans =

     1     2     3     4     5     6     7     8     9    10

>> ch1.units

ans =

    'm'

Любая помощь будет приветствоваться. Большое спасибо.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Тем временем я нашел что-то, что, кажется, слишком далеко, чтобы сделать именно то, к чему я стремился: заставить новый класс наследовать от стандартного двойного класса MATLAB:

classdef ChannelDouble < double
    properties
        units
    end

    methods
        function this = ChannelDouble(data, units)            
            this = this@double(data);
            this.units = units;            
        end
    end  
end

Этот класс возвращает:

 >> ch1 = ChannelDouble([1:10], 'm')

ch1 = 

  1×10 ChannelDouble array with properties:

    units: 'm'

  double data:
     1     2     3     4     5     6     7     8     9    10

>> ch1.^2  % <--- Standard notation returns the data just like a double array would do

ans =

     1     4     9    16    25    36    49    64    81   100

>> ch1.units

ans =

    'm'

Если кто-нибудь может придумать лучшее решение, пожалуйста, дайте мне знать. В противном случае я оставлю этот ответ здесь на случай, если он может помочь кому-либо с подобной проблемой.

1 голос
/ 01 апреля 2020

Нет, ch1 сам по себе является объектом. Вы можете получить вывод MATLAB "ans = 1 2 3 ...", если вы введете ch1 самостоятельно (перегружая метод display), но это на самом деле не присвоит это значение ans. В частности, вы не можете изменить результат foo = ch1, foo всегда будет сам объект.

С другой стороны, вы можете перегрузить метод double, так что foo = double(ch1) дает так же, как foo = ch1.value.


Обратите внимание, что

Я в процессе рефакторинга некоторых устаревших программных продуктов MATLAB [...]

автоматически приводит к

Это, тем не менее, потребует изменения каждой отдельной строки в унаследованном коде [...]

Рефакторинг кода включает в себя много переписывания. Если вы не хотите менять столько кода, сделайте рефакторинг менее инвазивным. Не меняйте простой массив на сложный объект.

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