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
无法初始化抽象属性 model
和 manufacturer
(这就像实例化一个抽象 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
我们在 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
抽象属性(和抽象方法)的目的是允许 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
无法初始化抽象属性 model
和 manufacturer
(这就像实例化一个抽象 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