gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:35:47 29 4
gpt4 key购买 nike

总的来说,我对我的 OOP 概念有点生疏,我仍在学习 MATLAB 的 OOP 实现细节。我有一个从父类(super class)继承的子类。我按照 MATLAB 的语法规则调用父类(super class)构造函数,如下所示:

obj = obj@MySuperClass(SuperClassArguments);

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

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);

我得到了错误:

When constructing an instance of class 'subClass', the constructor must preserve the class of the returned object.

有什么关于我出错的提示吗?

最佳答案

问题似乎与 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

我还建议将这些函数包含在类的方法 block 中(而不是文件中的 local functions),因为那是 typical format对于单文件类定义。作为本地函数,我相信它们会默认为 protected /私有(private)方法,因为使用 methods 看不到它们。 .此外,将它们放在方法 block 中允许您使用 obj.functionA() 语法来调用它们,这在它们被定义为本地函数时显然是不允许的。

关于matlab - 为什么我收到错误 "the constructor must preserve the class of the returned object"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56671585/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com