AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Beispiel für Polymorphie gesucht

Ein Thema von Luckie · begonnen am 28. Jan 2004 · letzter Beitrag vom 22. Feb 2004
 
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#27

Re: Beispiel für Polymorphie gesucht

  Alt 3. Feb 2004, 08:57
Hallo Motzi,

Zitat von Motzi:
as prüft [..] nochmal [..] ob der Cast korrekt ist und löst gegebenenfalls eine Exception aus
Das ist wahr sollte aber idR nicht ins Gewicht fallen: Zwar hängt die Ausführungszeit stark von der Tiefe der Hierarchie ab, aber bei einem ~1.2GHz Rechner konnte ich mit einer Tiefe von 8 Ebenen knapp 17 Millionen Ergebnisse pro Sekunde vom is Operator verzeichnen.

Für mich stellt sich, gerade bei einem Anfänger-Tutorial eher die Frage nach der Konsistenz. Sowohl bei Ereignisbehandlungsroutinen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Sender as TButton do
    Caption:= AMethod;
,die "eigentlich nur von einem Button" aufgerufen werden sollten, als auch bei sonstigen Parametern kann eine zusätzliche und dabei so effiziente Form der Überprüfung nicht schaden.
Häufig schon habe ich gesehen, dass zu einem späteren Zeitpunkt solche Routinen auch mit einem NotifyEvent einer anderen Klasse (zB dem OnChange-Event eines Edits) verknüpft werden und dann- im Fall eines nicht abgesicherten Casts zu Problemen führen.

Bei Interfaces hingegen ist die Problematik noch schwerwiegender: Ein Konstrukt der Art
Delphi-Quellcode:
procedure SomeTest(const AReference: IInterface);
begin
  if Supports(AReference, IMyInterface) then
    IMyInterface(AReference).AMethod;
wird zwar kompiliert werden, kann aber trotz des erfolgreichen Tests (Supports) zu Fehlern führen, wenn in diesem Fall die Routine SomeTest in dieser (nicht seltenen) Form aufgerufen wird, die sich mit allen Deklarationen und Typen deckt, also keinen Fehler zur Compilierzeit hervorruft:
Delphi-Quellcode:
type
  TMyClass = class(TMyAncestor, IInterface, IMyInterface)
  end;
//..
var
  myRef: IInterface;
begin
  myRef:= TMyClass.Create;
  SomeTest(myRef);
Eine Lösung mit as innerhalb von SomeTest hingegen arbeitet fehlerfrei.

Weil einem Anfänger so gesagt werden kann: "Verwende immer as und nur as, um einen Cast durchzuführen" wird er den direkten Cast meiden und kann auch nicht in Versuchung geführt Konstrukte der Art
Delphi-Quellcode:
var
  s: string[4];
begin
  Integer(s):= $badfood;
zu verwenden, um vermeintlich einiges an Performance herauszuholen, dabei aber Randbedingungen zu übersehen...
gruß, choose
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz