Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ständiges Typecasting bei Parametern (https://www.delphipraxis.net/80422-staendiges-typecasting-bei-parametern.html)

Cöster 8. Nov 2006 19:18


ständiges Typecasting bei Parametern
 
Hi!

Ich übergebe Items[I] von einer von TObjectList abgeleiteten Klasse als Parameter an eine selbstgeschriebene Methode. Die Methode erwartet allerdings keinen Parameter vom Typ TObject, sondern vom eigenen Typen namens TItem. Nun muss ich immer, wenn ich Items[I] als Parameter an diese Methode übergebe "as TItem" hinzufügen.

Meine Fragen dazu:

1. Ist es möglich, dass der Rückgabewert von Items[I] nicht TObject sondern TItem immer ist? Denn die von TObjectList abgeleitete Klasse soll sowieso nur Objekte vom Typen TItem verwalten.

2. Wie macht man das am besten?

3. Ist das überhaupt ratsam? Geschwindigkeitsfressend?

mkinzler 8. Nov 2006 19:27

Re: ständiges Typecasting bei Parametern
 
Zitat:

1. Ist es möglich, dass der Rückgabewert von Items[I] nicht TObject sondern TItem immer ist? Denn die von TObjectList abgeleitete Klasse soll sowieso nur Objekte vom Typen TItem verwalten.
Natürlich
Zitat:

2. Wie macht man das am besten?
Am einfachsten den Getter überladen
Zitat:

3. Ist das überhaupt ratsam? Geschwindigkeitsfressend?
Nein man, sagt dem Compiler ja nur, wie er den Speicherbereich interpretieren soll.

Elvis 8. Nov 2006 19:34

Re: ständiges Typecasting bei Parametern
 
Zitat:

Zitat von Cöster
1. Ist es möglich, dass der Rückgabewert von Items[I] nicht TObject sondern TItem immer ist? Denn die von TObjectList abgeleitete Klasse soll sowieso nur Objekte vom Typen TItem verwalten.
2. Wie macht man das am besten?

Mak aus den Fingern gesaugt:
Delphi-Quellcode:
type
  TSomeItemList = class(TObjectList)
  private
    function getItem(aIndex : Integer) : TSomeItem;
    procedure setItem(aIndex : Integer; aValue : TSomeItem);
  public
    property Item[aIndex : Integer] : TSomeItem
      read getItem(aIndex : Integer) : TSomeItem;
      write setItem(aIndex : Integer; aValue : TSomeItem);
  end;
function TSomeItemList.getItem(aIndex : Integer) : TSomeItem;
begin
  result := inherited Item[aIndex] as TSomeItem;
end;

procedure TSomeItemList.setItem(aIndex : Integer; aValue : TSomeItem);
begin
  inherited Item[aIndex] := aValue;
end;
Einfach weiterhin eine TObjectList, nur diesmal mit einem typisierten Indexer. ;)
Delphi-Quellcode:
3. Ist das überhaupt ratsam? Geschwindigkeitsfressend?
Ein Hard cast "TSomeItem(someValue)" kostet gar nix, außer der explicit-Operator wurde überschrieben.
Ein safe cast "(someValue as TSomeItem)" enthält eine Typenprüfung und kostet somit etwas. Aber es kostet nur minimal.

Cöster 8. Nov 2006 20:13

Re: ständiges Typecasting bei Parametern
 
Danke, ich werd's nachher oder vll auch erst morgen mal ausprobieren.

Zitat:

Zitat von Elvis
Ein Hard cast "TSomeItem(someValue)" kostet gar nix, außer der explicit-Operator wurde überschrieben.
Ein safe cast "(someValue as TSomeItem)" enthält eine Typenprüfung und kostet somit etwas. Aber es kostet nur minimal.

Interessanter Hinweis! Aber was ist ein explicit-Operator? Was ist der Sinn, Safe Cast zu benutzen, wenn's schlechter ist? Warum ist's safe und das andere hard? OK liegt wahrscheinlich daran, dass ich nicht versteh, was du mit explicit-Operator meinst

mkinzler 8. Nov 2006 20:15

Re: ständiges Typecasting bei Parametern
 
Ein safe-Cast überprüft, ob die Typen kompatibel sind, ein hard cast nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 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