Einzelnen Beitrag anzeigen

hboy

Registriert seit: 16. Jan 2004
364 Beiträge
 
#16

AW: Basisklassenroutine kann nicht auf vererbte Variablen zugreifen?

  Alt 6. Jun 2011, 21:50
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)
Power is nothing without TControl

Geändert von hboy ( 6. Jun 2011 um 22:12 Uhr)
  Mit Zitat antworten Zitat