我使用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
答案 0 :(得分: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
方法创建一个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>
时发现的所有问题。