2

MATLAB での継承の簡単な例を試していました。

次のように、Man.m と Worker.m の 2 つのファイルがあります。

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 に答える