我们在MATLAB R2014b中有方法和属性的abstract
属性,我知道方法的abstract
属性的用途。我们可以在该方法中调用函数并在类的超类中定义它。我感到困惑的是MATLAB中属性的abstract
属性的目的。我们如何使用它?
答案 0 :(得分:3)
抽象属性(和抽象方法)的目的是允许creation of interfaces:
接口类的基本思想是指定每个子类必须实现的属性和方法,而不定义实际的实现。
例如,您可以使用定义
定义抽象Car
classdef (Abstract) Car
properties(Abstract) % Initialization is not allowed
model
manufacturer
end
end
无法初始化抽象属性model
和manufacturer
(这类似于实例化抽象类),并且从Car
继承的所有类必须为其指定其值子类是具体的。
如果属性不是抽象的,则子类将继承它们。
使属性抽象形成一种合同,即“为了使您成为可用的(具体)汽车,您必须model
和manufacturer
定义”。
因此,在定义中
classdef FirstEveryManCar < Car
properties
model = 'T';
manufacturer = 'Ford';
end
end
对于类,必须使用属性定义来自动生成抽象(如果您有长类层次结构,则可以执行此操作)。
答案 1 :(得分:2)
setter / getter方法有一个重要的结果(即set.Property&amp; get.Property)。
由于Matlab的工作方式,您只能在声明属性的类的类定义文件中实现setter / getter方法。因此,如果要确保在接口中定义属性,但需要实现特定的setter / getter方法,则在接口类中声明属性Abstract可确保子类重新定义属性并使该类能够定义自己的setter / getter方法
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
答案 2 :(得分:1)
我不知道你真正需要它的任何例子,但它通常在抽象超类使用属性而没有合理的默认值时使用。这是一个非常精简的示例,但想象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不会抛出错误