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

时间:2017-10-12 23:17:54

标签: matlab

我使用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 个答案:

答案 0 :(得分: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方法创建一个Dependent属性,该方法只是将值传递给底层serial对象或从底层serial对象传递值。同样,如果您需要访问serial对象的方法,请在您的类上创建一个方法,该方法只是将调用传递给基础subsref对象。

此模式使用组合而不是继承。无论如何,这通常(并不总是)是一种很好的做法,但在这种情况下,它还可以为您节省您在重载<p> @Html.ActionLink("Create New", "Create") @using (Html.BeginForm("Index", "Movies", FormMethod.Get)) { <p> Genre: @Html.DropDownList("movieGenre", "All") Title: @Html.TextBox("searchStringEntered") <input type="submit" value="Filter" /> </p> } @using (Html.BeginForm("Index", "Movies", FormMethod.Get)) { <p> <input type="submit" value="Cancel Filter" /> </p> } </p> 时发现的所有问题。