MATLAB继承-我做错了什么



我在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

最新更新