Ok, nehmen wir vielleicht einen Schritt Abstand, von außen sehen beide Implementierungen gleich aus,
Delphi-Quellcode:
Type TUserInteractionHandler = class(TObject)
private
obj: TObject;
ConnectionIsValid : Boolean;
IsConnected : Boolean;
public
OnDisconnect : TNotifyEvent;
procedure Disconnect;
procedure VectorObjectsChanged(Sender: TObject); virtual; abstract;
end;
Type TCreatePointHandler = class(TUserInteractionHandler)
public
procedure VectorObjectsChanged(Sender: TObject); {override;} // edit: das override ist unerheblich.
end;
implementation
procedure TUserInteractionHandler.Disconnect;
begin
ConnectionIsValid := False;
IsConnected := False;
if assigned(OnDisconnect) then OnDisconnect(Self);
end;
procedure TCreatePointHandler.VectorObjectsChanged(Sender: TObject);
begin
if assigned(obj) and ConnectionIsValid then
Self.Disconnect;
end;
und zum Zweiten
Delphi-Quellcode:
Type TUserInteractionHandler = class(TObject)
private
obj: TObject;
ConnectionIsValid : Boolean;
IsConnected : Boolean;
public
OnDisconnect : TNotifyEvent;
procedure Disconnect;
procedure VectorObjectsChanged(Sender: TObject); virtual;
end;
Type TCreatePointHandler = class(TUserInteractionHandler)
end;
implementation
procedure TUserInteractionHandler.Disconnect;
begin
ConnectionIsValid := False;
IsConnected := False;
if assigned(OnDisconnect) then OnDisconnect(Self);
end;
procedure TUserInteractionHandler.VectorObjectsChanged(Sender: TObject);
begin
if assigned(obj) and ConnectionIsValid then
Self.Disconnect;
end;
erstere tut das, was man erwartet, letztere nicht. Warum?
ps.: bei anderen Methoden, die etwas direkter aufgerufen werden, löst der Aufruf einen EAbstractError aus, wenn man die Override-Direktive weglässt, bei der angeführten Methode scheint der Aufruf jedoch keinen Fehler zu produzieren, ob man override hinschreibt oder nicht. Es werden keine Warnungen ausgegeben. Übrigens nutze ich den Turbo Delphi Explorer (build 10.0.2228.42451) unter Windows 7 (64 bit)