MATLAB 中 abstract 属性 的用途是什么?

What is purpose of abstract property in MATLAB?

我们在 MATLAB R2014b 中有方法和属性的 abstract 属性,我知道方法的 abstract 属性的用途。我们可以在该方法中调用函数,并在 class 的 superclass 中定义它。我感到困惑的是 MATLAB 中 属性 的 abstract 属性的用途。我们如何使用它?

我不知道您真正需要它的任何示例,但它通常在抽象超类使用没有合理默认值的属性时使用。这是一个极其精简的示例,但想象一下 welcome 实现了一个完整的用户界面,而 welcomeGer 填写了所有必需的属性以提供德语:

%welcome.m
classdef welcome
    properties(Abstract)
        text
    end
    methods
        function printText(obj)
            disp(obj.text)
        end

    end
end

%welcomeGer.m
classdef welcomeGer<welcome
    properties
        text='Willkommen in unserem Hotel'
    end

end

或者您可以完全跳过 text 的定义,但是当您忘记初始化 text

时,matlab 不会抛出错误

抽象属性(和抽象方法)的目的是允许 creation of interfaces:

The basic idea of an interface class is to specify the properties and methods that each subclass must implement without defining the actual implementation.

例如,您可以使用定义

定义一个抽象Car
classdef (Abstract) Car
    properties(Abstract) % Initialization is not allowed
      model
      manufacturer
    end
end

无法初始化抽象属性 modelmanufacturer(这就像实例化一个抽象 class)以及继承自 [=12 的所有 classes =] 必须指定子class 的值是具体的。 如果属性不是抽象的,则 subclass 将简单地继承它们。 将属性抽象化形成一种合同,上面写着 "for you to be a usable (concrete) car you must have a model and manufacturer defined".

因此,在定义中

classdef FirstEveryManCar < Car
    properties
      model = 'T';
      manufacturer = 'Ford';
    end
end

属性 定义是强制性的,因为 class 不会自动抽象(如果你有很长的 class 层次结构,你可以这样做)。

setter/getter 方法(即 set.Property 和 get.Property)有重大影响。

由于 Matlab 的工作方式,您只能在声明 属性 的 class 的 class 定义文件中实现 setter/getter 方法。因此,如果你想确保在接口中定义 属性,但需要实现特定的 setter/getter 方法,那么在接口 class 中声明 属性 抽象确保子class 重新定义 属性 并使 class 能够定义自己的 setter/getter 方法。

示例 1(不起作用)

超级class

classdef (Abstract) TestClass1 < handle
    properties
        Prop
    end
end

亚class

classdef TestClass2 < TestClass1
    methods
        function obj = TestClass2(PropVal)
            if nargin>0
                obj.Prop = PropVal;
            end
        end

        function set.Prop(obj, val)
            if ~isnumeric(val)
                error('Not a number!');
            end
            obj.Prop = val;
        end
    end
end

示例2(正确方法)

超级class

classdef (Abstract) TestClass1 < handle

    properties (Abstract)
        Prop
    end
end

亚class

classdef TestClass2 < TestClass1
    properties
        Prop
    end
    methods
        function obj = TestClass2(PropVal)
            if nargin>0
                obj.Prop = PropVal;
            end
        end
        function set.Prop(obj, val)
            if ~isnumeric(val)
                error('Not a number!');
            end
            obj.Prop = val;
        end
    end
end