2

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

我正在尝试继承所有内容ManWorker但它不断向我抛出错误。Man(5,6) 有效,但 Worker(5,6,7) 无效。( Input argument "s" is undefined.)

类似的,如果我做一些简单的事情

classdef Woman < Man
end

根据指南,这是有效的。

我究竟做错了什么?

4

1 回答 1

1

由于超类构造函数需要参数,因此您必须在子类中显式调用它:

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(不期望参数)。一种解决方法是通过提供默认值(如果适用)来允许这两种情况:

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
于 2013-08-31T08:00:08.557 回答