AGB  ·  Datenschutz  ·  Impressum  







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

Result im generischen Objekt vorbelegen.

Ein Thema von bernau · begonnen am 5. Mär 2016 · letzter Beitrag vom 7. Mär 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#1

Result im generischen Objekt vorbelegen.

  Alt 5. Mär 2016, 23:39
Ich will in einer generischen Klasse das Result festlegen, obwohl ich den Type gar nicht kenne.

Ich weis nicht ob das so verständlich beschrieben ist, daher mal ein Beispiel:

Delphi-Quellcode:
type
 TMyGenType<TSonstwas> = class
   private
   protected
     Function MyDefaultValue:TSonstwas;virtual;
   public
end;

Function TMyGenType<TSonstwas>.MyDefaultValue:TSonstwas;
begin
  if TSonstwas is integer then
    integer(Result) := 42;
  if TSonstwas is String then
    string(Result) := '42';
end;
In der Funktion MyDefaultValue möchte ich vorab für einige Typen das Result festlegen. Ein Typecasting und der "is"-Parameter funktionieren natürlich nicht.

Ich habe zwar mittlerweile herausgefunden, wie man mit Hilfe von TValue aus der Rtti-Unit den Typen herausfinden kann. Somit kann ich das "is" schon mal ersetzen. Aber dem Result kann ich nichts zuweisen. Ich weiss zumindest nicht wie. Jemand eine Idee?
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Result im generischen Objekt vorbelegen.

  Alt 6. Mär 2016, 00:00
Funktioniert evtl. PInteger(@Result)^ := 42 ?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Result im generischen Objekt vorbelegen.

  Alt 6. Mär 2016, 00:06
Vielleicht funktioniert es mit einem Variant?

Delphi-Quellcode:
Function TMyGenType<TSonstwas>.MyDefaultValue:TSonstwas;
var
  Value: Variant;
begin
  Value := 42;
  Result := Value;
end;
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#4

AW: Result im generischen Objekt vorbelegen.

  Alt 7. Mär 2016, 10:56
@Namenloser: Die Variante geht leider nicht.

@Zacherl: Deine Variante funktioniert. Habe ich mit Integer und Double getestet.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Result im generischen Objekt vorbelegen.

  Alt 7. Mär 2016, 10:56
Delphi-Quellcode:
function TMyGenType<TSonstwas>.MyDefaultValue: TSonstwas;
begin
  Result := Default;
  ...
end;
$2B or not $2B
  Mit Zitat antworten Zitat
madas

Registriert seit: 9. Aug 2007
207 Beiträge
 
#6

AW: Result im generischen Objekt vorbelegen.

  Alt 7. Mär 2016, 11:47
Delphi-Quellcode:
function TMyGenType<TSonstwas>.MyDefaultValue: TSonstwas;
begin
  Result := Default;
  ...
end;
Liefert aber sicher nicht die gewünschte 42 bzw. den String '42'.

Btw.: der Sinn hinter der "function" erschließt sich mir noch nicht so wirklich. O-Ton MS "Generic classes encapsulate operations that are not specific to a particular data type." und dies wäre bei der "function" ja schon nicht mehr der Fall, da eine gewisse Abhängigkeit zu bestimmten Typen vorhanden ist.

Geändert von madas ( 7. Mär 2016 um 11:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Result im generischen Objekt vorbelegen.

  Alt 7. Mär 2016, 12:02
Achso, dann mal mit TValue versuchen.
Delphi-Quellcode:
Result := TValue(42).AsType<T>;
Result := TValue(42).Cast<T>;
...
Selbst wenn der Compiler Result := TSonstwas(42); erlaubt, wird es so eh nicht gehen, denn bei einem String kommt da nur Schrott bei raus.
$2B or not $2B

Geändert von himitsu ( 7. Mär 2016 um 12:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#8

AW: Result im generischen Objekt vorbelegen.

  Alt 7. Mär 2016, 14:43
Liefert aber sicher nicht die gewünschte 42 bzw. den String '42'.

Btw.: der Sinn hinter der "function" erschließt sich mir noch nicht so wirklich. O-Ton MS "Generic classes encapsulate operations that are not specific to a particular data type." und dies wäre bei der "function" ja schon nicht mehr der Fall, da eine gewisse Abhängigkeit zu bestimmten Typen vorhanden ist.
Ich habe das Beispiel gewählt, weil ich eigentlich nur wissen wollte, wie man den Result mit einem Wert belegen kann. Der Sinn ist hier tatsächlich wertfrei.

Hintergrund ist ein generisches Objekt in dem ich einige Berechnungen durchführe. Als Typen für den Generischen Parameter sollen verschiedene numerische Typen verwendet werden. Von dem Objekt gibt es unterschiedliche Ableitungen. Wenn ich nun die mathematische Funktion erst am Ende der Vererbungskette implementiere, dann muss mehrfach die gleiche Berechnung Programmiert werden. Das will ich mir sparen, in dem ich die Berechnung schon in der Wurzel der Vererbungskette implementiere. Dort steht allerdings noch nicht der Type des generischen Parameters fest.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#9

AW: Result im generischen Objekt vorbelegen.

  Alt 7. Mär 2016, 14:46
Selbst wenn der Compiler Result := TSonstwas(42); erlaubt, wird es so eh nicht gehen, denn bei einem String kommt da nur Schrott bei raus.
Bei einem String würde ich früh genug eine Exception auslösen.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#10

AW: Result im generischen Objekt vorbelegen.

  Alt 7. Mär 2016, 14:53
Achso, dann mal mit TValue versuchen.
Delphi-Quellcode:
Result := TValue(42).AsType<T>;
Result := TValue(42).Cast<T>;
...
Result := TValue(42).AsType<T>; Das Funktioniert. Sieht für mich sogar eleganter aus, als die Pointer-Geschichte. Danke.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:19 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