Почему я получаю сообщение об ошибке «конструктор должен сохранить класс возвращаемого объекта»? - PullRequest
2 голосов
/ 19 июня 2019

Я немного устала от своих концепций ООП в целом и все еще изучаю особенности реализации ООП MATLAB.У меня есть подкласс, который наследуется от суперкласса.Я следовал синтаксическим правилам MATLAB, чтобы вызывать конструктор суперкласса следующим образом:

obj = obj@MySuperClass(SuperClassArguments);

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

содержимое файла subClass.m:

classdef subClass < superClass
    properties (Access = public)
        arg1 = 1        
    end

    methods
        function obj = subClass(arg1)
            obj = obj@superClass(arg1);
        end
    end
end

superClass.mсодержимое файла:

classdef superClass
    properties (Access = protected)
        arg2
    end

    methods
        function obj = superClass(local_arg1)
            switch local_arg1
                case 1
                    obj = functionA();
                otherwise
                    obj = functionB();
            end
        end       
    end
end
function obj = functionA(obj)
    obj.arg2 = 1;
end
function obj = functionB(obj)
    obj.arg2 = 2;
end

Я создаю объект подкласса в командной строке MATLAB следующим образом:

>> a = subClass(1);

И получаю ошибку:

При построении экземпляра класса 'subClass' конструктор должен сохранять класс возвращаемого объекта.

Есть ли какие-либо указатели на то, что я ошибаюсь?

1 Ответ

1 голос
/ 19 июня 2019

Кажется, проблема в классе superClass.Когда вы вызываете свои функции functionA и functionB, вам нужно передать текущий объект:

classdef superClass
  properties (Access = protected)
    arg2
  end

  methods
    function obj = superClass(local_arg1)
      switch local_arg1
        case 1
          obj = functionA(obj);
          %Or: obj = obj.functionA();
        otherwise
          obj = functionB(obj);
          %Or: obj = obj.functionB();
      end
    end
  end

  methods (Access = private)
    function obj = functionA(obj)
      obj.arg2 = 1;
    end
    function obj = functionB(obj)
      obj.arg2 = 2;
    end
  end
end

Я бы также предложил включить эти функции в блок метода для класса (вместо * 1007).* локальные функции в файле), так как это типичный формат для определения класса в одном файле.Как локальная функция, я полагаю, что по умолчанию они будут использовать защищенные / закрытые методы, поскольку они не видны при использовании methods.Кроме того, наличие их в блоке методов позволяет использовать их для вызова синтаксиса obj.functionA(), что, по-видимому, недопустимо, когда они определены как локальные функции.

...