验证属性为MATLAB中抽象类的子类

时间:2019-07-05 10:15:10

标签: matlab validation oop

我是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中有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您当前的代码使用以下逻辑:

  1. 创建一个新的simpoint对象
  2. 这个对象需要一个outputType属性
  3. outputType属性初始化为空的dataType对象
  4. 哦,我们不能实例化一个抽象对象-错误。

相反,您还可以使用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是抽象的。指定属性项目的默认值。