为什么我会收到错误"the constructor must preserve the class of the returned object"?



总的来说,我对我的OOP概念有点生疏,我仍在学习MATLAB的OOP实现细节。我有一个继承自超类的子类。我遵循 MATLAB 的语法规则调用超类构造函数,如下所示:

obj = obj@MySuperClass(SuperClassArguments);

我已经检查了其他类似的问题,但我似乎遗漏了一些东西,因为我的语法似乎与其他类似问题中的示例以及 MATLAB 文档中显示的内容相似,除了我需要在进行超类构造函数调用时使用子类属性。

子类.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"的实例时,构造函数必须保留返回对象的类。

关于我做错了什么的任何指示?

问题似乎出在superClass类上。当你调用函数functionAfunctionB时,你需要传递当前对象:

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

我还建议将这些函数包含在类的方法块中(而不是作为文件中的本地函数(,因为这是单文件类定义的典型格式。作为本地函数,我相信它们会默认为受保护/私有方法,因为它们在使用 methods 是不可见的。此外,将它们放在方法块中允许您使用 obj.functionA() 语法来调用它们,当它们被定义为本地函数时,这显然是不允许的。

最新更新