Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [OOP]: Typenumwandlung / Casten (https://www.delphipraxis.net/29462-%5Boop%5D-typenumwandlung-casten.html)

mytar 9. Sep 2004 13:46


[OOP]: Typenumwandlung / Casten
 
  • Wie ist Typ() zu verstehen?
  • Was ist der Unterschied zu as?
  • Upcasten
  • Downcasten
  • Was passiert konkret bei Up- und Downcasten von Objekten?

dizzy 9. Sep 2004 18:47

Re: [OOP]: Typenumwandlung / Casten
 
Zitat:

Zitat von mytar
Wie ist Typ() zu verstehen?

Das ist ein direkter Cast des in den Klammern stehenden Objektes in den Typ den du vor den Klammern angibst.
Zitat:

Zitat von mytar
Was ist der Unterschied zu as?

Aus der OH:

Der Operator as führt eine Typumwandlung mit Laufzeitprüfung durch. Der Ausdruck

Objekt as Klasse

gibt eine Referenz auf dasselbe Objekt wie Objekt, aber mit dem von Klasse angegebenen Typ zurück. Zur Laufzeit muss Objekt eine Instanz von Klasse oder einem ihrer Nachkommen bzw. nil sein. Andernfalls wird eine Exception ausgelöst.

Dass heisst, dass du mit as sicherstellen kannst, dass nur gültige Downcasts (s.u.) durchgeführt werden, und sonst eine Exception ausgelöst wird.
Zitat:

Zitat von mytar
Upcasten

...geht nicht. (imho)
Zitat:

Zitat von mytar
Downcasten

Ist, wenn du ein Objekt einer Klasse in ein Objekt eines Klassenvorgängers castest.
Bsp:
Delphi-Quellcode:
type
  TClass1 = class
  public
    Wert: Integer;
  end;
 
  TClass2 = class(TClass2)
  public
    Buchstabe: Char;
  end;

.
.
var
  C1: TClass1;
  C2: TClass2;
.
.
// Dies ist ein gültiger Downcast
  C1 := C2 as TClass1;

// Das hier ein nicht möglicher Upcast
  C2 := C1 as TClass2;
Zitat:

Zitat von mytar
Was passiert konkret bei Up- und Downcasten von Objekten?

Nach dem Downcasten hast du nur noch Zugriff auf die Felder des Objektes, die schon in der Zielklasse deklariert sind. Im obigen Beispiel hättest du nach dem Downcast keinen Zugriff mehr auf C2.Buchstabe, da das Objekt C2 jetzt mit C1 referenziert wird, welches aber vom Typ TClass1 ist, und "Buchstabe" nicht kennt.

Ich hoffe das war soweit alles richtig - müsste aber ;)

gruss,
dizzy

mytar 10. Sep 2004 11:56

Re: [OOP]: Typenumwandlung / Casten
 
Danke für die Hilfe! :-D

Letze Frage: Was ist der Unterschied zwischen Typ() und as?
Lediglich die Laufzeitprüfung?


Danke :-D

Chewie 10. Sep 2004 12:05

Re: [OOP]: Typenumwandlung / Casten
 
Zitat:

Zitat von mytar
Letze Frage: Was ist der Unterschied zwischen Typ() und as?
Lediglich die Laufzeitprüfung?

Genau :thuimb:

mytar 10. Sep 2004 12:31

Re: [OOP]: Typenumwandlung / Casten
 
Danke für die Hilfe! :-D

Möchte mich ganz besonders bei:
  • Dizzy
  • Chewie
bedanken

Für mich [Erledigt]!

Phoenix 10. Sep 2004 12:50

Re: [OOP]: Typenumwandlung / Casten
 
Zitat:

Zitat von dizzy
Zitat:

Zitat von mytar
Upcasten

...geht nicht. (imho)

Geht ja wohl :)

Voraussetzung ist allerdings, das das Ding vorher irgendwie (z.B. durch einen Prozeduraufruf) schon heruntergecasted wurde.

Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
   // harter upcast
   TButton(Sender).Caption := 'clicked';

   // soft upcast
   (Sender as TButton).Caption := 'clicked';

   // ganz sicher:
   if sender is TButton then
   with sender as TButton do
   begin
      Caption := 'clicked';
   end;
end;
Hier wird ein TObject also hochgecasted, und das in den verschiedenen möglichkeiten. Sowas wird meistens dann verwendet, wenn man ein OnClick-Event für verschiedene Buttons verwendet und / oder mit dem entprechenden Control gleich was machen will (z.B. deaktivieren oder so).

Christian Seehase 10. Sep 2004 21:27

Re: [OOP]: Typenumwandlung / Casten
 
Moin Zusammen,

noch ein kleiner Unterschied zwischen Typ() und as:

Bei Typ() übernimmt, sozusagen, der Entwickler die Verantwortung, dass der Typecast zur Laufzeit gültig ist, bei as kann, u.U., schon zur Compilierzeit geprüft werden, ob der Typecast gültig ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 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 by Thomas Breitkreuz