Matlab子类实例化类型检查报错:超类构造函数调用位置异常
为啥会触发这个奇葩错误?
兄弟,这个坑我踩过不止一次了!Matlab的子类构造函数有个死规则:你必须先调用超类的构造函数,才能碰子类的obj对象——不管是访问属性、调用方法,甚至不小心写了个obj = obj;这种没用的代码,只要在超类构造前动了obj,或者提前return了,就会弹出这个错误。
你说的参数类型检查导致问题,大概率是你把检查代码放在了超类构造调用之前,而且不小心在检查里用到了obj(比如误写了访问子类属性的代码),或者某些检查逻辑间接触发了对象初始化。
靠谱的参数类型检查方式
按照Matlab的规矩,给你几种安全的检查方案:
1. 先怼参数,再调超类(最稳妥)
在调用超类构造函数之前,先对传入的原始参数做检查——完全不碰obj,纯检查输入值本身。比如:
classdef MySubClass < MySuperClass properties CustomProp end methods function obj = MySubClass(inputArg) % 第一步:先查参数,跟obj半毛钱关系都没有 if ~isa(inputArg, 'double') || inputArg < 0 error('输入得是非负的double类型啊兄弟!'); end % 第二步:必须先喊超类构造 obj = obj@MySuperClass(inputArg); % 第三步:再搞子类自己的事 obj.CustomProp = inputArg * 2; end end end
2. 依赖超类属性的检查,放超类构造之后
如果你的检查需要用到超类初始化后的属性,那老老实实等超类构造完再搞:
function obj = MySubClass(inputArg) % 先调用超类,让超类把它的属性初始化好 obj = obj@MySuperClass(inputArg); % 现在可以放心查超类的属性了 if ~isa(obj.SuperProp, 'char') error('超类返回的属性类型不对啊!'); end % 子类自己的逻辑跟上 obj.CustomProp = upper(obj.SuperProp); end
3. 让Matlab自动帮你查(懒人福音)
如果是检查类属性的类型、范围,直接用Matlab的属性验证语法,不用自己写一堆if判断,Matlab会自动帮你做检查:
classdef MySubClass < MySuperClass properties % 直接指定属性得是正整数double,赋值时自动验证 CustomProp double {mustBeNonnegative, mustBeInteger} end methods function obj = MySubClass(inputArg) % 先调超类构造 obj = obj@MySuperClass(inputArg); % 赋值的时候Matlab会自动检查,不符合直接报错 obj.CustomProp = inputArg; end end end
4. 把检查逻辑抽成工具函数(复用性拉满)
如果有很多地方要做同样的检查,把检查逻辑写成独立的工具函数,在构造开头调用——同样,只传原始参数,不碰obj:
% 单独的验证函数,放同一个文件夹或者工具包 function validateMyInput(inputArg) if ~isa(inputArg, 'double') error('输入必须是double类型!'); end if inputArg > 100 error('输入值不能超过100啊喂!'); end end % 子类构造里用 function obj = MySubClass(inputArg) % 先跑验证,没问题再往下走 validateMyInput(inputArg); % 调用超类构造 obj = obj@MySuperClass(inputArg); % 子类逻辑 ... end
避坑提醒
- 绝对别在超类构造之前碰
obj,哪怕是看似无害的obj = obj;都会触发错误。 - 参数检查失败别用
return,直接抛error就行——return会让Matlab觉得你提前终止了构造,也会触发那个错误。 - 如果超类本身已经做了参数检查,子类别重复搞冲突的检查,不然容易乱。
内容的提问来源于stack exchange,提问作者darkcard
相关产品推荐
相关产品推荐

