Einzelnen Beitrag anzeigen

Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: Virtuelle Methode überladen

  Alt 4. Aug 2014, 08:57
Vielen Dank für die Erklärung. Mit reintroduce funktioniert es wie gewünscht. Damit wäre meine Frage erledigt.

Jetzt kommt der philosophische Teil, wo über den besten Weg diskutiert werden darf
Wenn das keine rein theoretische Frage ist, dann könnte das ein Hinweis auf ein schlechtes Design sein. Meistens findet man ein 'Workaround', d.h. eine Umformulierung des Codes, der sich im Nachhinein als sauberer herausstellt. Wieso z.B. muss die neue Methode genauso heißen? Macht sie wirklich das Gleiche?
Sie macht das Gleiche und noch ein bisschen mehr.

Ich könnte sie auch umbenennen, wobei ich mich frage, ob das in diesem Fall sauberer wäre.

Hier der "echte" Fall: es geht um die UniDac-Komponenten. Dazu gibt es den Sql-Monitor, der alle Sql-Anfragen, die von den Komponenten Richtung Server geschickt werden, ausgibt. Das ist sehr praktisch für Debuggingzwecke.
Die Connection bietet die Methode "MonitorMessage", mit der ich eine eigene Meldung im Sql-Monitor ausgeben kann (auch zu Debugzwecken manchmal hilfreich).

Die wollte ich nun mit dem Transactionhandling verbinden:
Delphi-Quellcode:
  TmyConnection = class(TUniConnection)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    procedure StartTransaction(ASqlMonitorMessage : String); overload;
    procedure Commit (ASqlMonitorMessage : String); reintroduce; overload;
    procedure Rollback (ASqlMonitorMessage : String); reintroduce; overload;
  published
    { Published-Deklarationen }
  end;
Was dann entsprechend so implementiert ist:
Delphi-Quellcode:
procedure TmyConnection.Commit(ASqlMonitorMessage: String);
begin
  MonitorMessage('<< Committing Transaction: ' + ASqlMonitorMessage);
  Commit;
end;

procedure TmyConnection.Rollback(ASqlMonitorMessage: String);
begin
  MonitorMessage('!! Rolling back Transaction: ' + ASqlMonitorMessage);
  Rollback;
end;

procedure TmyConnection.StartTransaction(ASqlMonitorMessage: String);
begin
  MonitorMessage('>> Starting Transaction: ' + ASqlMonitorMessage);
  inherited StartTransaction;
end;
nun kann ich in TmyConnection.StartTransaction/Commit/Rollback einen eigenen Text mitgeben, der für die Fehlersuche (insbesondere beim Kunden, wo ich kein Delphi installiert hab) hilfreich sein soll.

Ich hätte natürlich auch die Methoden "StartTransactionWithMessage" oder so nennen können. Aber wäre das hier sinnvoll/sauber?
Ist sicher Ansichtssache.
Jens
  Mit Zitat antworten Zitat