Matlab调用超类抽象构造函数语法看起来很奇怪

Posted

技术标签:

【中文标题】Matlab调用超类抽象构造函数语法看起来很奇怪【英文标题】:Matlab calling superclass abstract constructor syntax seems strange 【发布时间】:2015-02-11 20:48:32 【问题描述】:

我正在尝试从继承类调用超类构造函数。 matlab documentation 中的官方语法是:

obj = obj@SuperClass(ArgumentList);

但是编辑器似乎警告说:

变量 `obj` 可以在定义之前使用。

此外,如果我尝试运行代码,我会收到错误消息““@”的左操作数必须是方法名称。”

可能出了什么问题?

【问题讨论】:

天哪,这很烦人......我的错误是子类的构造函数名称有错字。编辑器和解释器都发现这是问题所在。 糟糕!这样就可以了。 【参考方案1】:

我发现这是子类构造函数名称拼写错误的结果。问题的最小重构如下:

classdef SuperDemo  < handle
    methods
        function obj = SuperDemo(opt)
            disp(['in super ', opt])
        end
    end
end

classdef SubDemo < SuperDemo
    methods
        function obj = SubDemoo(opt) % NOTICE THE TYPO SubDemoo 
            disp(['in sub ', opt])
            obj = obj@SuperDemo(opt);
        end
    end
end

如果你调用s = SubDemo('hello')你会得到错误:

错误使用 SubDemo 错误:文件:SubDemo.m 行:5 列:19 "@" 在一个方法中,一个同名的超类方法被调用 说方法@超类。 “@”的左操作数必须是方法 名字。

此错误具有误导性,因为左操作数是 obj 而不是 SubDemo。 错误信息应该已经表明构造函数名SubDemoo与类名SubDemo不一样。

【讨论】:

以上是关于Matlab调用超类抽象构造函数语法看起来很奇怪的主要内容,如果未能解决你的问题,请参考以下文章

如何取消超类对默认 Matlab 函数的覆盖

在Java中_not_调用超类构造函数的任何方法?

17. 虚析构函数再谈动态绑定多态到底是啥抽象类

面向对象设计思想之一(构造器和继承)

从构造函数的主体调用超类构造函数

C++ 未定义的抽象类构造函数