Bene, problema semplice: se si reintroduce un metodo, si nasconderà il/i metodo/i genitore/i. Questo dovrebbe essere esattamente quello che vuoi, ma controllare questo codice:
type
TClassParent = class
public
procedure DoSomething; overload;
procedure DoSomething(Something: Integer); overload;
end;
TClassChild = class(TClassParent)
public
procedure DoSomething(SomethingElse: string); reintroduce;
end;
var
Child: TClassChild;
begin
Child := TClassChild.Create;
Child.DoSomething;
Child.DoSomething(1024);
Child.DoSomething('Something');
Questo vi dà due errori! Perché? Poiché entrambi i metodi DoSomething nel genitore sono ora nascosti! A volte, vuoi questo. Altre volte, non lo fai. E quando non lo fai, è necessario aggiungere i metodi mancanti alla classe figlia di nuovo, chiamando il metodo ereditato in questo modo:
procedure TClassChild.DoSomething(SomethingElse: string);
begin
inherited DoSomething(SomethingElse);
end;
Poi di nuovo, questo è quello che vuoi, giusto? Nascondere tutti i metodi genitore con lo stesso nome. Non dimenticare che puoi comunque chiamare i metodi ereditati.
Ricordati anche di collegare le interfacce alla classe genitore. La classe figlio continuerà a supportare l'interfaccia, ma chiamando i metodi attraverso l'interfaccia anziché l'oggetto risulterà in una chiamata al genitore, non al bambino!
Reintrodurre i metodi è una buona pratica nel caso in cui si desidera nascondere i metodi dal genitore. Tuttavia, nasconderà anche i metodi virtuali con lo stesso nome! Normalmente, sarebbe più semplice sovrascrivere i metodi virtuali, ma quando si modifica l'elenco dei parametri, l'uso di reintroduzione in realtà disabiliterebbe la classe genitore in circostanze normali al di fuori della classe. All'interno della classe, hai ancora accesso a loro, senza avvisi ...
fonte
2010-11-18 11:17:35
Tank you! Nascondere tutti i costruttori della classe base è esattamente quello che voglio. Nella maggior parte dei casi, una chiamata di un operatore di classe base non è sufficiente per inizializzare completamente l'oggetto concreto. – hansmaad
Nota che reintrodurre semplicemente sopprime un avviso del compilatore. Il comportamento di runtime è lo stesso con o senza di esso. Stai attento se nascondi un distruttore. Se chiami 'TObject.Free' il distruttore figlio non verrà mai chiamato. –
@Codeelegance, no. Reintroduzione renderà i metodi genitore non disponibili! Senza Reintrodurre, puoi comunque chiamare il metodo genitore senza alcun p [roblems. Con il reintrodurre, quei metodi genitore sono "andati", disponibili solo all'interno della classe figlio. –