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 sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.413 Beiträge
 
Delphi 12 Athens
 
#1

Re: Klassen in Delphi

  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 Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Klassen in Delphi

  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

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Klassen in Delphi

  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
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#4

Re: Klassen in Delphi

  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.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Klassen in Delphi

  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

Registriert seit: 21. Mai 2005
Ort: Gera
22 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Klassen in Delphi

  Alt 5. Jul 2005, 17:02
http://www.luckie-online.de/Tutorials/ >>tolle wurst, link tod!
Thomas Seidel
begin; 011010101101010100101010; end;
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

Registriert seit: 25. Jun 2003
Ort: AC
740 Beiträge
 
Delphi 7 Professional
 
#7

Re: Klassen in Delphi

  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

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Klassen in Delphi

  Alt 5. Jul 2005, 17:15
Link korregiert. Aber das wäre auch etwas freundlicher gegangen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#9

Re: Klassen in Delphi

  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

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Klassen in Delphi

  Alt 5. Jul 2005, 19:05
So, ihr habt mich überzeugt , in der neuen Version ist es verbessert. Link siehe erstes Posting.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 04:46 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