AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Klassen in Delphi
Tutorial durchsuchen
Ansicht
Themen-Optionen

Klassen in Delphi

Ein Tutorial von Luckie · begonnen am 19. Feb 2004 · letzter Beitrag vom 2. Dez 2007
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Benutzerbild von Luckie
Luckie
Registriert seit: 29. Mai 2002
Klassen in Delphi
Thema: Einführung in die objektorientierte Programmierung mit Delphi
Datum: 2007-12-02

Das Tutorial wurde - im Zuge der Vereinheitlichung der Layouts meiner PDF-Dokumente - noch mal neu mit Latex geschrieben. Inhaltlich hat sich nichts geändert. Das Layout ist jetzt doppelseitig und kann so schön ausgedruckt und gebunden werden (falls das jemand machen sollte ).

Das Tutorial liegt als PDF vor und kann hier: http://delphitutorials.michael-puff.de runtergeladen bzw. online eingesehen werden. In dem dazugehörigen Zip Archiv (Klassen_in_Delphi.zip) befinden sich noch zusätzlich Demos.

2007-12-02:
Kapitel "Sichtbarkeiten" ünberarbeitet.
Anhang mit Interans zum Konstruktor, Destruktor und Methodenzeigern von Andreas Hausladen.
Angehängte Dateien
Dateityp: zip klassen_in_delphi_demos_655.zip (24,1 KB, 92x aufgerufen)
Dateityp: pdf klassen_in_delphi_120.pdf (323,2 KB, 199x aufgerufen)
Ein Teil meines Codes würde euch verunsichern.
 
Benutzerbild von sakura
sakura

 
Delphi 11 Alexandria
 
#11
  Alt 19. Feb 2004, 09:37
Also ich habe auch ein wenig gelernt. Fakt ist aber, das nicht TRectangle.Draw aufgerufen wird, wenn das Objekt mit TFigure.Create aufgerufen wurde, sondern TFigure.Draw Ich hätte im schlimmsten Fall eine AV erwartet

Anbei ein kleines Beispiel, das den obigen Umstand näher betrachtet.

......
Angehängte Dateien
Dateityp: zip classes.zip (2,3 KB, 19x aufgerufen)
Daniel W.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

 
Delphi 2009 Professional
 
#12
  Alt 19. Feb 2004, 09:52
Hallo,
das hat mein Weltbild zerstört.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TFigure = class(TObject)
    procedure Draw(Caption: string);
  end;

  TRectangle = class(TFigure)
    procedure Draw(Caption: string);
    procedure Show(Caption : String);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TFigure.Draw(Caption: string);
begin
  Messagebox(0, 'Draw Methode von TFigure', @Caption[1], 0);
end;

procedure TRectangle.Draw(Caption: string);
begin
  Messagebox(0, 'Draw Methode von TRectangle', @Caption[1], 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Figure: TFigure;
  Rectangle: TRectangle;
  aObj : TObject;
begin
  ...
  Figure := TFigure.Create;
  try
    TRectangle(Figure).Show('TFigure.Create / TRectangle(Figure).Draw');
      // Show nicht in TFigure trotzdem wird aber TRectangle.Show aufgerufen.
   finally
    FreeAndNil(Figure);
  end;
  ...
end;

procedure TRectangle.Show(Caption: String);
begin
  Messagebox(0, 'Show Methode von TRectangle', @Caption[1], 0);
end;

end.
Das ist nicht zu fassen obwohl Show keine Methode von TFigure ist, wird durch den Cast TRectangle.Show aufgerufen.
Hat jemand dafür eine Erklärung ?
  Mit Zitat antworten Zitat
Chewie

 
Turbo Delphi für Win32
 
#13
  Alt 19. Feb 2004, 10:22
Die Delphi-Hilfe sagt zu statischen Methoden:

Zitat:
Beim Aufruf bestimmt der deklarierte Typ (also der Typ zur Compilierzeit) der im Aufruf verwendeten Klassen- bzw. Objektvariable, welche Implementierung aktiviert wird.
D.h. im Compilat steht gar nix von TFigure.Draw, sondern es wird einfach die Methode Draw von TRectangle aufgerufen. Nur bei virtuellen und dynamischen Methoden wird wohl zur Laufzeit eine Typüberprüfung vollzogen.
Martin Leim
  Mit Zitat antworten Zitat
neolithos

 
Delphi 7 Architect
 
#14
  Alt 19. Feb 2004, 10:24
Eine Klasse besteht soviel ich weis aus einer

Methoden-Tabelle (glaub VMT genannt) und den Daten auch als Instanze bezeichnet.

Beides ist getrennt.


wird nun TRectangle.Show aufgerufen geschieht das so

TRectangle.Show(Figure, 'TFigure.Create / TRectangle(Figure).Draw'); Die Instanze wird als erster Hidden-Parameter übergeben.

EDIT: Hättest du in Show auf einen Member von TRectangle zugegriffen wäre es erst zu einer AV gekommen. Member von TFigure wären ohne Probleme möglich gewesen.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

 
Delphi 2009 Professional
 
#15
  Alt 19. Feb 2004, 10:25
Zitat von Chewie:
D.h. im Compilat steht gar nix von TFigure.Draw, sondern es wird einfach die Methode Draw von TRectangle aufgerufen. Nur bei virtuellen und dynamischen Methoden wird wohl zur Laufzeit eine Typüberprüfung vollzogen.
Ahh - das klingt logisch.
  Mit Zitat antworten Zitat
Benutzerbild von tmode00
tmode00

 
Delphi 7 Enterprise
 
#16
  Alt 5. Jul 2005, 17:02
http://www.luckie-online.de/Tutorials/ >>tolle wurst, link tod!
Thomas Seidel
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

 
Delphi 7 Professional
 
#17
  Alt 5. Jul 2005, 17:12
Zitat von tmode00:
http://www.luckie-online.de/Tutorials/ >>tolle wurst, link tod!
Ich vermisse mal wieder die Eigeninitiative. Ich hab mich gerade mal von luckie-online.de durchgeklickt und hatte nach weniger als 5 Sekunden das hier http://www.luckie-online.de/Developer/Delphi/Tutorials/
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#18
  Alt 5. Jul 2005, 17:15
Link korregiert. Aber das wäre auch etwas freundlicher gegangen.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#19
  Alt 5. Jul 2005, 17:59
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
...
    TRectangle(Figure).Show('TFigure.Create / TRectangle(Figure).Draw');
...
Ich habe das Tut nicht gelesen, gebe aber Sakura absolut Recht. Dieses Beispiel ist ein absolutes Negativbeispiel wie man es auf garkeinen Fall machen sollte. Es könnte aber als Eingangs-Beispiel für die Vermeidung von harten TypCast bei Klassen dienen. Denn so wie nachfolgend wäre der TypCast OOP konform richtiger gewesen:

Delphi-Quellcode:

 (Figure as TRectangle).Show;
Dieser Typcast würde dann eine Exception zu Laufzeit erzeugen, das TFigure NICHT von TRectangle abgeleitet wurde, und somit auf diesen offensichtlichen Programmierfehler hinweisen.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#20
  Alt 5. Jul 2005, 19:05
So, ihr habt mich überzeugt , in der neuen Version ist es verbessert. Link siehe erstes Posting.
Michael
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 03:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz