Проверять свойство как подкласс абстрактного класса в MATLAB - PullRequest
0 голосов
/ 05 июля 2019

Я новичок в ООП в Matlab, и все еще довольно зеленый, когда дело доходит до ООП в целом, но то, что я знаю, я узнал в C ++.

Я следую документации по Matlab, найденной здесь Проверка класса и размера объекта .Я хочу проверить свойство так, чтобы это был определенный класс, и я использую пример из ссылки.Вот как выглядит мой класс:

classdef simpoint
   ...
   properties
      ...
      outputType dataType
      ...
   end
   ...
end

В моем коде dataType - это класс, который я написал.Более того, он абстрактный.

Я получаю сообщение об ошибке

Error defining property 'outputType' of class 'simpoint':
Class dataType is abstract. Specify a default value for property outputType.

Класс dataType является абстрактным, чтобы заставить пользователя реализовать некоторые методы.Я пытаюсь использовать проверку свойства, чтобы убедиться, что при установленном outputType класс является подклассом dataType.

Я не хочу устанавливать значение по умолчанию, потому что забыл установитьoutputType должен выдать ошибку.

Как я могу проверить outputType, чтобы убедиться, что это подкласс dataType?Есть ли лучший способ сделать это в Matlab?

1 Ответ

2 голосов
/ 05 июля 2019

Ваш текущий код использует следующую логику:

  1. Создать новый simpoint объект
  2. Ах, этот объект нуждается в outputType свойстве
  3. Инициализируйте свойство outputType как пустой dataType объект
  4. Ух, мы не можем создать экземпляр абстрактного объекта - ошибка.

Вместо этого вы также можете использовать установщики и получатели для проверки типов данных. Это удаляет шаги 3 и 4 выше, поскольку начальное значение свойства будет [].

classdef simpoint < matlab.mixin.SetGet
    properties
        outputType
    end
    methods 
        % ...
    end
    methods % Setters and getters
        function set.outputType( obj, v )
            % When the 'obj.outputType = X' is called, this function is
            % triggered. We can validate the input first
            assert( isa( v, 'dataType' ) );
            % If the assertion didn't error, we can set the property
            obj.outputType = v;
        end
        function v = get.outputType( obj )
            % Nothing bespoke in the getter (no not strictly needed), just return the value
            v = obj.outputType;
        end
    end
end

Для более информативной проверки вы можете использовать validateattributes вместо assert.

В этом случае значение по умолчанию outputType будет [], если вы не инициализируете его в конструкторе.

Обратите внимание, что, используя matlab.mixin.SetGet для включения сеттеров и геттеров, я неявно сделал ваш объект handle. В более широких терминах ООП объект теперь доступен «по ссылке», а не «по значению». Подробнее здесь .

Если вам не нужен дескриптор, вы можете удалить < matlab.mixin.SetGet и, своим собственным комментарием, более четко определить установщик

function obj = set.outputType( obj, v )
    % Have to return 'obj' if the class isn't a handle.
    % ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...