Matlab 检查器不会列出子类的对象属性

Posted

技术标签:

【中文标题】Matlab 检查器不会列出子类的对象属性【英文标题】:Matlab inspector will not list object properties of subclass 【发布时间】:2017-10-12 23:17:54 【问题描述】:

我正在使用 Matlab 2017a 并且有一个继承自串行类的子类。创建子类的对象后,我看不到其他子类属性。例如inspect(subclassobject)properties(subclassobject) 将只列出超类序列的属性。仍然可以使用点符号subclassobject.property 来查看或更改属性值,但是 set 和 get 函数会产生错误,说明子类属性不是类“串行端口对象”的可访问实例。我已经包含了我的类定义和构造函数。

classdef subclass < serial
    properties 
        prop_1
    end
    methods
        % Constructor
        function obj = subclass(port)
            obj = obj@serial(port);
            %port is a string ex. 'com3' that is necessary for
            %constructing the serial class
        end
    end
end

【问题讨论】:

【参考方案1】:

serial 类重载了subsref 方法,该方法是在您索引对象时调用的方法,例如使用myobject.mypropertymyobject(1)。并且查看代码(toolbox\matlab\serial\@serial\subsref.m),它似乎并没有以一种非常干净的方式完成。

因此,您在子类化serial 时会遇到困难,除非您在您的子类上实现subsref。正确实施subsref 是一个痛苦的世界。只是我的 2c,但我认为 MathWorks 可能应该将 serial 设为密封类,这样您甚至无法尝试对其进行子类化。

我猜你会继续遇到类似的问题(我想我几天前看到了另一个类似的问题,可能来自你,表明你可能已经发现了这个问题)。

我建议您不要子类化serial。相反,创建一个包装 serial 的类,如下所示:

classdef MyClass
    properties (Hidden, Access = private)
        myserialobject
    end
    properties
        mySubClassProp1
        mySubClassProp2
        %...
    end
    properties (Dependent)
        mySerialProp1
        mySerialProp2
        %...
    end
    methods
        function obj = MyClass(port)
            obj.myserialobject = serial(port);
            % Set other subclass props
        end
    end
    methods
        function val = get.mySerialProp1(obj)
            val = obj.myserialobject.mySerialProp1;
        end
        function obj = set.mySerialProp1(obj, val)
            obj.myserialobject.mySerialProp1 = val;
        end
        %... pass through get and set for each serial prop you need to access
        function obj = mySerialMethod1(obj, varargin)
            mySerialMethod1(obj.myserialobject, varargin:);
        end
        %... pass through method for each serial method you need to access
    end
end

基本上你有一个类,它有一个serial 对象作为属性,并且它自己也有一堆属性和方法。每当您需要访问serial 对象的属性时,请使用getset 方法创建一个从属属性,这些方法仅将值传入或传出底层serial 对象。同样,如果您需要访问 serial 对象的方法,请在您的类上创建一个方法,将调用传递给底层 serial 对象。

此模式使用组合而不是继承。无论如何,这通常(并非总是)是一个好习惯,但在这种情况下,它还可以为您节省您在重载 subsref 时发现的所有问题。

【讨论】:

以上是关于Matlab 检查器不会列出子类的对象属性的主要内容,如果未能解决你的问题,请参考以下文章

010.里式转换命名空间字段属性索引器

Matlab属性检查器怎么调整参数

java中私有的属性、静态成员可以被子类继承吗?

无法创建托管对象的子类

父类的成员变量赋了值,子类继承该变量,值还是父类的值吗?

面向对象编程