繁体   English   中英

MATLAB中抽象属性的目的是什么?

[英]What is purpose of abstract property in MATLAB?

我们在MATLAB R2014b中有方法和属性的abstract属性,我知道方法的abstract属性的目的。 我们可以在该方法中调用函数并在类的超类中定义它。 我很困惑的是MATLAB中属性的abstract属性的目的。 我们怎么用这个?

抽象属性(和抽象方法)的目的是允许创建接口

接口类的基本思想是指定每个子类必须实现的属性和方法,而不定义实际的实现。

例如,您可以使用定义定义抽象Car

classdef (Abstract) Car
    properties(Abstract) % Initialization is not allowed
      model
      manufacturer
    end
end

抽象属性modelmanufacturer无法初始化(就像实例化抽象类),并且从Car继承的所有类必须将子类的值指定为具体的 如果属性不是抽象的,则子类将继承它们。 使属性抽象形成一种合同,即“为了成为一辆可用的(混凝土)汽车,你必须有一个modelmanufacturer定义”。

因此,在定义中

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

类的属性定义是强制性的,不能自动生成抽象(如果你有长类层次结构,你可以这样做)。

setter / getter方法有一个重要的结果(即set.Property和get.Property)。

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

示例1(不起作用)

classdef (Abstract) TestClass1 < handle
    properties
        Prop
    end
end

子类

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(正确的方法)

classdef (Abstract) TestClass1 < handle

    properties (Abstract)
        Prop
    end
end

子类

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

我不知道你真正需要它的任何例子,但它通常在抽象超类使用属性而没有合理的默认值时使用。 这是一个非常精简的示例,但想象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不会抛出错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM