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