我在MATLAB中尝试了一个简单的继承示例。
我有两个文件Man.m和Worker.m如下:
classdef Man
properties
salary;
age;
end
methods
function obj=Man(s,a)
obj.salary=s;
obj.age=a;
end
function monthly_salary=FactorBy12(obj)
monthly_salary=obj.salary/12;
end
end
end
和
classdef Worker < Man
properties
years_at_organization;
end
methods
function obj=Worker(y,s,a)
obj.years_at_organization=y;
obj.salary=s;
obj.age=a;
end
function bonus=BonusToBeGiven(obj)
bonus=obj.years_at_organization;
end
end
end
我正试图继承Worker
中的所有Man
,但它不断向我抛出错误。人(5,6)工作,工人(5,6,7)不工作。(Input argument "s" is undefined.
)
如果我做像这样简单的事情
classdef Woman < Man
end
根据本指南,这是有效的。
我做错了什么?
由于超类构造函数需要参数,因此必须在子类中显式调用它:
classdef Worker < Man
properties
years_at_organization;
end
methods
function obj = Worker(y,s,a)
obj = obj@Man(s,a); % call ctor of superclass
obj.years_at_organization = y;
end
function bonus = BonusToBeGiven(obj)
bonus = obj.years_at_organization;
end
end
end
对超类构造函数的隐式调用只适用于默认的ctor(不需要参数的ctor)。一种变通方法是通过提供默认值(如果适用)来允许这两种情况:
classdef Man
...
methods
function obj = Man(s,a)
if nargin < 2, a = 20; end
if nargin < 1, s = 1000; end
obj.salary = s;
obj.age = a;
end
...
end
end
注意,如果你想构建一个对象数组,这样的默认构造函数是必要的:
>> m(5) = Man(5,3)
m =
1x5 Man array with properties:
salary
age