如何使用Matlab的抽象属性并在具体子类中声明其类型

How to use Matlab's abstract property and to declare its type in the concrete subclass

我试图描述一个抽象 class AA 有一个抽象 属性 X 类型的 BB。这个 属性 BB 因 AA 的不同具体子 class 而不同。这个BB也是一个抽象class,它的具体子class会作为AA的不同具体子class的X。但是,当我尝试按照以下代码执行此操作时,我收到一条错误消息。

所以首先,AA和AA混凝土是

classdef (Abstract) AA
    properties (Abstract)
        X@BB;
    end
end

classdef AAconcrete < AA
    properties
        X@BBconcrete;
    end
end

BB 和 BBconcrete 是

classdef (Abstract) BB < matlab.mixin.Heterogeneous
end

classdef BBconcrete < BB
end

当我尝试启动 AAconcrete 时,收到以下错误消息。

>> a = AAconcrete
Error using AAconcrete
The property 'X' restriction defined in class 'AAconcrete' must match the
property definition in base class 'AA'.

我理解错误消息说 BBconcrete 类型与 BB 不同,尽管 isa(BBconcrete,'BB') returns 正确。即使我没有在抽象 class AA 中将 X 声明为 BB 类型,也会出现相同的错误消息。

我想知道描述这种关系的正确方式是什么,非常感谢您的帮助!

不要试图使 MATLAB 成为一种强类型的编程语言,这通常不会成功。使用你的基础 class 并且(如果需要)在写入时检查数据类型:

classdef AAconcrete < AA
    properties
        X@BB;
    end
    methods
        function set.X(obj,x)
            assert(isa(x,'BBconcrete'));
            obj.X=x;
        end
    end
end

除了 Daniel 的回答之外,我建议您尝试在 AAConcrete 中为 X 重新定义类型是您的问题。要么删除 AA 中的类型定义,要么(我的建议)在 AAConcrete 中删除它,并使用 set.X 函数来限制 AA Concrete 中的类型:

function set.X(obj, value);
    validateattributes(value, 'BBConcrete', {'nonempty'});
    obj.X = value;
end;