DMarlon Studio

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.

Pascal · Herencia e inherited en DMarlon Studio: el código del ejemplo y su salida en la terminal

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.
  • is comprueba 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.