Lección 3 · 3 de 20
Herencia e inherited · Pascal
Cree clases hijas en Object Pascal que heredan campos y métodos, y llame al constructor de la clase madre con inherited en Free Pascal.

La herencia crea una clase a partir de otra. TManager = class(TEmployee) recibe todo lo de TEmployee (los campos Name y Salary y el método Print) y solo añade lo nuevo: el campo Team y su propio constructor.
El constructor de TManager no repite el trabajo de su madre: `inherited Create(AName, ASalary)` llama al constructor de TEmployee, que rellena el nombre y el sueldo, y después solo queda guardar Team. Llamar a inherited al principio del constructor es el patrón habitual.
boss.Print funciona aunque TManager no declare ningún Print: lo busca en la clase madre. Por eso la primera línea de la salida la escribe código de TEmployee con los datos de un TManager.
El operador `is` comprueba si un objeto es de una clase o de alguna de sus descendientes, y devuelve TRUE para boss is TEmployee: un jefe también es un empleado. ClassName devuelve el nombre real de la clase, TManager.
Toda clase desciende al final de TObject, de ahí vienen Create, Free y ClassName. En Lazarus lo verá en cada ventana: TForm1 = class(TForm) hereda todo lo que sabe hacer un formulario y usted solo añade lo suyo.
Código · main.pas
program main;type TEmployee = class Name: String; Salary: Double; constructor Create(const AName: String; ASalary: Double); procedure Print; end; TManager = class(TEmployee) // inherits Name, Salary and Print Team: Integer; constructor Create(const AName: String; ASalary: Double; ATeam: Integer); end;constructor TEmployee.Create(const AName: String; ASalary: Double);begin Name := AName; Salary := ASalary;end;procedure TEmployee.Print;begin WriteLn(Name, ' earns ', Salary:0:0, ' EUR a month');end;constructor TManager.Create(const AName: String; ASalary: Double; ATeam: Integer);begin inherited Create(AName, ASalary); // the parent fills Name and Salary Team := ATeam;end;var boss: TManager;begin boss := TManager.Create('Javier Ruiz', 3600, 5); boss.Print; // a TEmployee method WriteLn(boss.ClassName, ' leads ', boss.Team, ' people; is a TEmployee: ', boss is TEmployee); boss.Free;end.Salida · fpc main.pas && ./main
Javier Ruiz earns 3600 EUR a month TManager leads 5 people; is a TEmployee: TRUE
Para recordar
class(TMadre)hereda campos y métodos.- La clase hija solo declara lo que añade o cambia.
inherited Create(...)reutiliza el constructor de la madre.iscomprueba la clase, incluidas las descendientes.- Todas las clases descienden de
TObject.
Ejercicio
Cree TSalesRep = class(TEmployee) con un campo Commission: Double (por ejemplo, 0.05) y un constructor que use inherited, y escriba su sueldo más la comisión sobre 20000 EUR de ventas.