2013-08-31 2 views
2

J'essayais un exemple simple pour l'héritage dans MATLAB.MATLAB Héritage - Qu'est-ce que je fais mal?

J'ai 2 fichiers Man.m et Worker.m comme suit:

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 

et

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 

Je suis en train d'hériter de tous Man en Worker, mais il continue à jeter une erreur à moi. L'homme (5,6) fonctionne mais le travailleur (5,6,7) ne fonctionne pas. (Input argument "s" is undefined.)

Comme si je fais quelque chose d'aussi simple que

classdef Woman < Man 
end 

qui, selon this guide est valide.

Qu'est-ce que je fais mal?

+0

suggestion: vous pouvez faire Classe 'Man' un handle-class au lieu d'une classe de valeur, en héritant de 'handle':' classdef Man Amro

Répondre

1

Depuis constructeur superclass attend des arguments, vous devez explicitly call dans la sous-classe:

classdef Worker < Man 
    properties 
     years_at_organization; 
    end 
    methods 
     function obj = Worker(y,s,a) 
      obj = [email protected](s,a);    % call ctor of superclass 
      obj.years_at_organization = y; 
     end 
     function bonus = BonusToBeGiven(obj) 
      bonus = obj.years_at_organization; 
     end 
    end 
end 

Le implicit call au constructeur superclasse ne fonctionne que pour le cteur par défaut (qui ne marche pas attendre des arguments). Une solution de contournement est de permettre les deux cas en fournissant default values le cas échéant:

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 

Notez qu'un tel constructeur par défaut est nécessaire si vous voulez construire un array of objects:

>> m(5) = Man(5,3) 
m = 
    1x5 Man array with properties: 

    salary 
    age 
+0

Merci Amro. Connaissez-vous un bon guide pour OOP dans MATLAB. La documentation officielle de MATLAB est assez petite et le guide dans ma question est assez faible. –

+0

@Inquest: Je trouve les docs officiels assez bons et étendus, et j'ai surtout appris ... Ça et ça traîne ici sur Stack Overflow :) – Amro

+0

Je suppose que je vais devoir travailler avec ceux-là. Merci. –

Questions connexes