我在MATLAB中尝试了一个简单的继承示例。
我有2个文件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
我正在尝试继承Man
中的所有Worker
,但它一直在向我抛出错误。
男人(5,6)工作,但工人(5,6,7)不工作。 (Input argument "s" is undefined.
)
如果我做的事情就像
那样简单classdef Woman < Man
end
根据this指南有效。
我做错了什么?
答案 0 :(得分:1)
由于superclass构造函数需要参数,因此必须在子类中explicitly call:
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
超类构造函数的implicit call仅适用于默认的ctor(不期望参数的ctor)。解决方法是通过提供default values(如果适用)允许两种情况:
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
请注意,如果要构建array of objects:
,则必须使用此类默认构造函数>> m(5) = Man(5,3)
m =
1x5 Man array with properties:
salary
age