AGB  ·  Datenschutz  ·  Impressum  







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

Parameter mit multiplen Typen

Ein Thema von Andreas L. · begonnen am 25. Jan 2024 · letzter Beitrag vom 1. Feb 2024
Antwort Antwort
Seite 1 von 2  1 2      
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#1

Parameter mit multiplen Typen

  Alt 25. Jan 2024, 11:05
Delphi-Version: 11 Alexandria
Hallo,

ich würde gerne wissen ob es eine Möglichkeit gibt, einen Parameter einer Routine mit mehreren Daten-Typen auszustatten? Die einzige Option die mir einfällt, wäre, die Routine zu überladen.

In PHP kann man z. B. so etwas machen:
Code:
function Test(string|bool $AParam1) {
  // ...
}
Bei dieser Funktion könnte man nun entweder einen String oder einen Boolean-Wert für "AParam1" übergeben. Gibt es so etwas wie diesen |-Operator auch in Delphi? Oder muss ich das zwangsläufig wie folgt angehen:

Delphi-Quellcode:
  function Test(AParam1: String): String; overload;
  function Test(AParam1: Boolean): String; overload;
Oder seht ihr noch andere Möglichkeiten?

Schöne Grüße,
Andreas Lauß
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
40 Beiträge
 
Delphi 12 Athens
 
#2

AW: Parameter mit multiplen Typen

  Alt 25. Jan 2024, 11:25
wie wäre es mit einem TObject?
Delphi-Quellcode:
function Test(AParam1: TObject): String;
begin
  if AParam1 is TOBJ1 then
  begin
    //
  end;
  if AParam1 is TOBJ2 then
  begin
    //
  end;
end;
natürlich mehr Aufwand alle Klassen anzulegen etc...
Chris

Geändert von LoZe (25. Jan 2024 um 11:29 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#3

AW: Parameter mit multiplen Typen

  Alt 25. Jan 2024, 11:38
Du kannst einen typlosen paramater verwenden
siehe dazu die Move Prozedur.
procedure Move(const Source; var Dest; Count: Integer); _
Oder TStream read Methode
function TStream.Read(var Buffer; Count: Longint): Longint; Du bekommst dann ein Stückspeicher, aber du musst dich vollständig selbst darum kümmern wie du es behandelst.... wenn du es nur verschlüsseln oder bewegen willst es aber ideal.

Dann gäbe es noch den Variant typ als paramaeter. Da kann man quasi alles übergeben.
Siehe die Locate Methode von TDataset
function TFDDataSet.Locate(const AKeyFields: string; const AKeyValues: Variant; AOptions: TLocateOptions = []): Boolean; _
Wenn du die Auswahl an möglichen Typen kennst, dann kannst du eventuell auch mit einem Varianten Record arbeiten.
Delphi-Quellcode:
type
    TFahrzeugList = (Irgendeins, PKW, LKW, Bus, Motorad, Zug);
    TFahrzeug = record
    case Fahrzeug: TFahrzeugList of
      PKW: (MaxSpeed: Integer;
            Cabrio:Boolean;
            DieselFuel:Boolean;
           );
      LKW: (MaxTonage: Single;
            Trailer:Boolean;
           );
      Bus: (Travelers:Integer;
            Toilet:Boolean;
           );
      Motorad: (Speed: integer;
                Sidecar:Boolean;
                HP:integer;
               );
      Zug: (Passengers:integer;
            Cars:integer;
            Cargolist:Tstringlist;
           );
      Irgendeins: ();
   end;
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (25. Jan 2024 um 12:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.459 Beiträge
 
Delphi 12 Athens
 
#4

AW: Parameter mit multiplen Typen

  Alt 25. Jan 2024, 12:40
Was genau spricht denn gegen das overload?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Parameter mit multiplen Typen

  Alt 25. Jan 2024, 13:53
Danke für eure Antworten

Was genau spricht denn gegen das overload?
Weil ich sehr viele Methoden habe, bei denen via Parameter zwei Typen (nämlich String und eine Klasse TtuString) übergeben werden sollen. Ich müsste alle 30 Methoden doppelt deklarieren.

Du kannst einen typlosen paramater verwenden
siehe dazu die Move Prozedur.
Typenlose Parameter kannte ich bereits, hatte aber gehofft das es noch einen "typisierten" Weg gibt. Aber ich denke genau das hier werde ich anwenden.

Dann gäbe es noch den Variant typ als paramaeter. Da kann man quasi alles übergeben.
Variants möchte ich nicht verwenden.

Wenn du die Auswahl an möglichen Typen kennst, dann kannst du eventuell auch mit einem Varianten Record arbeiten.
Delphi-Quellcode:
type
    TFahrzeugList = (Irgendeins, PKW, LKW, Bus, Motorad, Zug);
    TFahrzeug = record
    case Fahrzeug: TFahrzeugList of
      PKW: (MaxSpeed: Integer;
            Cabrio:Boolean;
            DieselFuel:Boolean;
           );
      LKW: (MaxTonage: Single;
            Trailer:Boolean;
           );
      Bus: (Travelers:Integer;
            Toilet:Boolean;
           );
      Motorad: (Speed: integer;
                Sidecar:Boolean;
                HP:integer;
               );
      Zug: (Passengers:integer;
            Cars:integer;
            Cargolist:Tstringlist;
           );
      Irgendeins: ();
   end;
Das wäre in meinem Fall eher weniger geeignet. Trotzdem ein tolles Konstrukt das man auch im Delphi-Code an vielen Stellen findet.

wie wäre es mit einem TObject?
Delphi-Quellcode:
function Test(AParam1: TObject): String;
begin
  if AParam1 is TOBJ1 then
  begin
    //
  end;
  if AParam1 is TOBJ2 then
  begin
    //
  end;
end;
Es sollen auch einfache Typen (insbesondere String) übergeben werden können.
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
880 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Parameter mit multiplen Typen

  Alt 25. Jan 2024, 14:04
Weil ich sehr viele Methoden habe, bei denen via Parameter zwei Typen (nämlich String und eine Klasse TtuString) übergeben werden sollen. Ich müsste alle 30 Methoden doppelt deklarieren.
So ins Blaue geraten würde ich mal annehmen, dass beide Varianten in etwa das Gleiche machen, nur dass der String einmal als String, und einmal als Objekt übergeben wird.

Wäre es dann eine Option, jeweils nur die TtuString-Variante zu implementieren, und die andere über ein temporäres tuString-Objekt zu realisieren? Also TuWas(CreateTmpTuString(einString)); ggf. mit optionalem Boolean-Parameter "AutoFree" bei TuWas, damit das temporäre String-Objekt direkt zerstört werden kann?
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.459 Beiträge
 
Delphi 12 Athens
 
#7

AW: Parameter mit multiplen Typen

  Alt 25. Jan 2024, 14:06
Weil ich sehr viele Methoden habe, bei denen via Parameter zwei Typen (nämlich String und eine Klasse TtuString) übergeben werden sollen.
Wie werden diese beiden Parametertypen behandelt? Kannst du einfach mal ein Beispiel geben für so eine Methode für String und TtuString (wie ist der Typ überhaupt deklariert)? Insbesondere wäre interessant, wie sich die Implementierung für diese beiden Typen unterscheidet.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.459 Beiträge
 
Delphi 12 Athens
 
#8

AW: Parameter mit multiplen Typen

  Alt 25. Jan 2024, 14:26
Um das mal abzukürzen: Nimm einfach TValue aus System.RTTI für den Parameter-Typ.
Delphi-Quellcode:
procedure DoIt(Param: TValue);
begin
  if Param.IsType<string> then
    ShowMessage(Param.AsString)
  else if Param.IsType<TForm> then
    ShowMessage(Param.AsType<TForm>.Caption);
end;

...

procedure TForm831.FormDblClick(Sender: TObject);
begin
  DoIt('string');
  DoIt(Self);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.613 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Parameter mit multiplen Typen

  Alt 25. Jan 2024, 22:29
Falls TtuString eine spezielle Art von String ist, könnte man ihn als enhanced Record mit einer implicit-Methode für Umwandlung aus String implementieren. Dann muss man nur den TtuString Parameter haben, weil ein string automatisch in einen TtuString umgewandelt würde.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.459 Beiträge
 
Delphi 12 Athens
 
#10

AW: Parameter mit multiplen Typen

  Alt 26. Jan 2024, 00:47
Falls TtuString eine spezielle Art von String ist,
Wenn ich das richtig lese ist TtuString eine Klasse:
bei denen via Parameter zwei Typen (nämlich String und eine Klasse TtuString) übergeben werden sollen.

könnte man ihn als enhanced Record mit einer implicit-Methode für Umwandlung aus String implementieren.
Aber genau diese implizite Umwandlung ist der Grund warum ich TValue vorgeschlagen habe.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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:39 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