MATLAB继承 - 我做错了什么?

时间:2013-08-31 07:10:08

标签: matlab oop inheritance constructor

我在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指南有效。

我做错了什么?

1 个答案:

答案 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