MATLAB中抽象属性的用途是什么?

MATLAB中抽象属性的用途是什么?,matlab,oop,Matlab,Oop,在MatlabR2014B中,我们有方法和属性的abstract属性,我知道方法的abstract属性的用途。我们可以在该方法中调用函数,并在类的超类中定义它。我感到困惑的是,MATLAB中属性的abstract属性的用途。我们如何使用它?我不知道您真正需要它的任何示例,但它通常在抽象超类使用属性而没有合理的默认值时使用。这是一个非常精简的示例,但是想象一下,welcomer实现一个完整的用户界面,而welcomer填充所有必需的属性以提供德语: %welcome.m classdef welc

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

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

%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
%welcome.m
欢迎光临
属性(摘要)
文本
结束
方法
函数printText(obj)
显示(对象文本)
结束
结束
结束
%welcomeGer.m

classdef welcomeGer抽象属性(和抽象方法)的目的是允许:

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

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

classdef (Abstract) Car
    properties(Abstract) % Initialization is not allowed
      model
      manufacturer
    end
end
抽象属性
model
manufacturer
无法初始化(这类似于实例化一个抽象类),并且从
Car
继承的所有类都必须为具体的子类指定其值。 如果属性不是抽象的,子类将简单地继承它们。 将属性抽象化形成了一种合同,其中规定“要想成为一辆可用的(具体的)汽车,必须定义
车型
制造商

因此,在定义中

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

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

setter/getter方法(即set.property和get.property)会产生重大后果

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

示例1(不起作用) 超类
classdef(抽象)TestClass1
子类
classdef TestClass20
对象属性=对象属性;
结束
结束
功能集.属性(obj,val)
如果~isnumeric(val)
错误('不是数字!');
结束
对象属性=值;
结束
结束
结束
例2(正确的方法) 超类
classdef(抽象)TestClass1
子类
classdef TestClass20
对象属性=对象属性;
结束
结束
功能集.属性(obj,val)
如果~isnumeric(val)
错误('不是数字!');
结束
对象属性=值;
结束
结束
结束

谢谢您的回答。因此,我们应该使用
model
manufacturer
的抽象属性定义
Car
类,而不进行任何初始化。这是真的吗?@user2991243我扩展了答案,以便更好地解释目的和行为。
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
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