El propósito del modificador de reintroducción es evitar un error lógico común.
Supongo que es de conocimiento común cómo la palabra clave reintroduce corrige la advertencia y explicará por qué se genera la advertencia y por qué la palabra clave está incluida en el idioma. Considere el código delphi a continuación;
TParent = Class
Public
Procedure Procedure1(I : Integer); Virtual;
Procedure Procedure2(I : Integer);
Procedure Procedure3(I : Integer); Virtual;
End;
TChild = Class(TParent)
Public
Procedure Procedure1(I : Integer);
Procedure Procedure2(I : Integer);
Procedure Procedure3(I : Integer); Override;
Procedure Setup(I : Integer);
End;
procedure TParent.Procedure1(I: Integer);
begin
WriteLn('TParent.Procedure1');
end;
procedure TParent.Procedure2(I: Integer);
begin
WriteLn('TParent.Procedure2');
end;
procedure TChild.Procedure1(I: Integer);
begin
WriteLn('TChild.Procedure1');
end;
procedure TChild.Procedure2(I: Integer);
begin
WriteLn('TChild.Procedure2');
end;
procedure TChild.Setup(I : Integer);
begin
WriteLn('TChild.Setup');
end;
Procedure Test;
Var
Child : TChild;
Parent : TParent;
Begin
Child := TChild.Create;
Child.Procedure1(1); // outputs TChild.Procedure1
Child.Procedure2(1); // outputs TChild.Procedure2
Parent := Child;
Parent.Procedure1(1); // outputs TParent.Procedure1
Parent.Procedure2(1); // outputs TParent.Procedure2
End;
Dado el código anterior, ambos procedimientos en TParent están ocultos. Decir que están ocultos significa que los procedimientos no pueden invocarse a través del puntero TChild. Compilar el ejemplo de código produce una sola advertencia;
[DCC Warning] Project9.dpr (19): W1010 Método 'Procedure1' esconde método virtual de tipo base 'TParent'
¿Por qué sólo una advertencia para la función virtual y no el otro? Ambos están ocultos.
Una virtud de Delphi es que los diseñadores de bibliotecas pueden lanzar nuevas versiones sin temor a romper la lógica del código de cliente existente. Esto contrasta con Java donde agregar nuevas funciones a una clase padre en una biblioteca está plagado de peligros porque las clases son implícitamente virtuales. Digamos que TParent desde arriba vive en una biblioteca de terceros, y la fabricación de la biblioteca publica la nueva versión a continuación.
// version 2.0
TParent = Class
Public
Procedure Procedure1(I : Integer); Virtual;
Procedure Procedure2(I : Integer);
Procedure Procedure3(I : Integer); Virtual;
Procedure Setup(I : Integer); Virtual;
End;
procedure TParent.Setup(I: Integer);
begin
// important code
end;
imaginar que tenían el siguiente código en nuestro código de cliente
Procedure TestClient;
Var
Child : TChild;
Begin
Child := TChild.Create;
Child.Setup;
End;
Para el cliente que no importa si el código se compila contra la versión 2 o 1 de la biblioteca, en ambos casos TChild. Se llama a la instalación como lo intenta el usuario. Y en la biblioteca;
// library version 2.0
Procedure TestLibrary(Parent : TParent);
Begin
Parent.Setup;
End;
Si se llama a TestLibrary con un parámetro TChild, todo funciona según lo previsto. El diseñador de la biblioteca no tiene conocimiento de TChild.Configuración, y en Delphi esto no les causa ningún daño. La llamada anterior se resuelve correctamente en TParent.Setup.
¿Qué pasaría en una situación equivalente en Java? TestClient funcionaría correctamente según lo previsto. TestLibrary no lo haría. En Java, todas las funciones se suponen virtuales. Parent.Setup se resolvería en TChild.Setup, pero recuerde que cuando se escribió TChild.Setup no tenían conocimiento del futuro TParent.Setup, por lo que ciertamente nunca lo llamarán heredado. Entonces, si el diseñador de la biblioteca intenta llamar a TParent.Setup, no será así, sin importar lo que hagan. Y ciertamente esto podría ser catastrófico.
Así que el modelo de objetos en Delphi requiere una declaración explícita de las funciones virtuales en la cadena de clases secundarias. Un efecto secundario de esto es que es fácil olvidarse de agregar el modificador de anulación en los métodos secundarios. La existencia de la palabra clave Reintroduce es una conveniencia para el programador. Delphi fue diseñado para que el programador sea persuadido gentilmente, mediante la generación de una advertencia, de declarar explícitamente sus intenciones en tales situaciones.
La mejor respuesta a esta pregunta es correcta, ¿puedes marcarla de esta manera? – LaKraven