我是Matlab中OOP的新手,总体而言,在OOP方面还是相当环保的,但是我知道我在C ++中学到的东西。
我正在跟踪Property class and size validation处的Matlab文档。我想验证一个属性,使其必须是一个特定的类,并且正在使用链接中的示例。这是我的班级样子:
classdef simpoint
...
properties
...
outputType dataType
...
end
...
end
在我的代码dataType
中,我编写了一个类。更重要的是,它是抽象的。
我遇到错误
Error defining property 'outputType' of class 'simpoint':
Class dataType is abstract. Specify a default value for property outputType.
类dataType
是抽象的,可以强制用户实现某些方法。我正在尝试使用属性验证来确保在设置outputType
时,该类是dataType
的子类。
我真的不想设置默认值,因为忘记设置outputType
会引发错误。
如何验证outputType
以确保它是dataType
的子类?在Matlab中有更好的方法吗?
答案 0 :(得分:2)
您当前的代码使用以下逻辑:
simpoint
对象outputType
属性outputType
属性初始化为空的dataType
对象相反,您还可以使用setter和getter来验证数据类型。由于初始属性值为[]
,因此删除了上面的步骤3和4。
classdef simpoint < matlab.mixin.SetGet
properties
outputType
end
methods
% ...
end
methods % Setters and getters
function set.outputType( obj, v )
% When the 'obj.outputType = X' is called, this function is
% triggered. We can validate the input first
assert( isa( v, 'dataType' ) );
% If the assertion didn't error, we can set the property
obj.outputType = v;
end
function v = get.outputType( obj )
% Nothing bespoke in the getter (no not strictly needed), just return the value
v = obj.outputType;
end
end
end
要获得更多信息,可以使用validateattributes
代替assert
。
在这种情况下,除非您在构造函数中对其进行初始化,否则outputType
的默认值为[]
。
请注意,通过使用matlab.mixin.SetGet
启用setter和getter,我已将您的对象隐式设置为handle
。在更广义的OOP术语中,现在可以通过“引用”而不是“按值”访问对象。了解更多here。
如果您不想使用手柄,则可以删除< matlab.mixin.SetGet
,并通过自己的注释更明确地定义设置器。
function obj = set.outputType( obj, v )
% Have to return 'obj' if the class isn't a handle.
% ...
end
答案 1 :(得分:2)
对于这个问题,有一个更为优雅的解决方案,这显然并不为人所知。
MATLAB具有Heterogeneous Class Hierarchies的概念。这只是显式声明公共根类(无论是否抽象)的奇特方法,以便可以 用于属性验证。实际上,您需要做的就是使您的抽象类继承自matlab.mixin.Heterogeneous
。
这是一个简单的例子:
classdef (Abstract) AbstractItem < handle & matlab.mixin.Heterogeneous
end
classdef Collection < handle
properties
items AbstractItem
end
end
那么您就没问题了
>> x = Collection
x =
Collection with properties:
items: [0×0 AbstractItem]
没有matlab.mixin.Heterogeneous
继承,您将得到一个与您描述的错误:
定义类“集合”的属性“项目”时出错。类AbstractItem是抽象的。指定属性项目的默认值。