35 - POO - Llamada de métodos desde otro método de la misma clase

Hasta ahora todos los problemas planteados hemos llamado a los métodos desde donde definimos un objeto de dicha clase, por ejemplo:

var
  Persona1: TPersona;
begin
  Persona1 := TPersona.Create;
  Persona1.Cargar;
  Persona1.Imprimir;
  Persona1.EsMayorDeEdad;
  Persona1.Free;

Utilizamos la sintaxis:

[nombre del objeto].[nombre del método]

Es decir antecedemos al nombre del método el nombre del objeto y el operador punto.
Ahora bien que pasa si queremos llamar dentro de la clase a otro método que pertenece a la misma clase, la sintaxis es la siguiente:

[nombre del método]

O en forma larga:

self.[nombre del método]

Es importante tener en cuenta que esto solo se puede hacer cuando estamos dentro de la misma clase.

Problema 1

Plantear una clase Operaciones que en un método solicite la carga de 2 enteros y posteriormente llame a otros dos métodos que calculen su suma y producto.

Proyecto130

program Proyecto130;

{$APPTYPE CONSOLE}

type
  TOperacion = class
    Valor1: Integer;
    Valor2: Integer;
    procedure Cargar;
    procedure Sumar;
    procedure Restar;
  end;

procedure TOperacion.Cargar;
begin
  Write('Ingrese primer valor:');
  ReadLn(Valor1);
  Write('Ingrese segundo valor:');
  ReadLn(Valor2);
  Sumar;
  Restar;
end;

procedure TOperacion.Sumar;
var
  suma: Integer;
begin
  suma := Valor1 + Valor2;
  WriteLn('La suma de ', Valor1, ' y ', Valor2, ' es ', suma);
end;

procedure TOperacion.Restar;
var
  resta: Integer;
begin
  resta := Valor1 - Valor2;
  WriteLn('La resta de ', Valor1, ' y ', Valor2, ' es ', resta);
end;

var
  operacion1: TOperacion;
begin
  operacion1 := TOperacion.Create;
  operacion1.Cargar;
  operacion1.Free;
  ReadLn;
end.

Nuestro método Cargar además de cargar los dos enteros en los campos procede a llamar a los métodos que calculan la suma y resta de los dos valores ingresados.

La llamada de los métodos de la misma clase se hace indicando el nombre del método.

Desde donde definimos un objeto de la clase TOperaciones llamamos a sus métodos antecediendo el nombre del objeto:

var
  operacion1: TOperacion;
begin
  operacion1 := TOperacion.Create;
  operacion1.Cargar;
  operacion1.Free;
  ReadLn;
end.

Problema propuesto

  • Declarar una clase llamada THijos. Definir dentro de la misma un vector estático para almacenar las edades de 5 personas.
    Definir un método cargar donde se ingrese por teclado el vector de las edades y llame a otros dos método que impriman la mayor edad y el promedio de edades.
Solución
program Proyecto131;

{$APPTYPE CONSOLE}

type
  TEdades = Array[1..5] of Integer;

  THijos = class
    Edades: TEdades;
    procedure Cargar;
    procedure mayorEdad;
    procedure calcularPromedio;
  end;

procedure THijos.Cargar;
var
  f: Integer;
begin
  WriteLn('Ingreso de Edades');
  for f:=1 to 5 do
  begin
    Write('Ingrese la edad:');
    ReadLn(Edades[f]);
  end;
  mayorEdad;
  calcularPromedio;
end;

procedure THijos.mayorEdad;
var
  f: Integer;
  may: Integer;
begin
  may := Edades[1];
  for f:=2 to 5 do
    if Edades[f] > may then
      may := Edades[f];
  WriteLn('La edad mayor de los 5 hijos es ', may);
end;

procedure THijos.calcularPromedio;
var
  suma: Integer;
  f: Integer;
  promedio: Integer;
begin
  suma := 0;
  for f:=1 to 5 do
    suma := suma + Edades[f];
  promedio := suma div 5;
  WriteLn('La edad promedio de los 5 hijos es ', promedio);
end;

var
  hijos1: THijos;
begin
  hijos1 := THijos.Create;
  hijos1.Cargar;
  hijos1.Free;
  ReadLn;
end.