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.myproperty
或myobject(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
对象的属性时,请使用get
和set
方法创建一个从属属性,这些方法仅将值传入或传出底层serial
对象。同样,如果您需要访问 serial
对象的方法,请在您的类上创建一个方法,将调用传递给底层 serial
对象。
此模式使用组合而不是继承。无论如何,这通常(并非总是)是一个好习惯,但在这种情况下,它还可以为您节省您在重载 subsref
时发现的所有问题。
【讨论】:
以上是关于Matlab 检查器不会列出子类的对象属性的主要内容,如果未能解决你的问题,请参考以下文章