Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Überladen von function geht nicht ? (https://www.delphipraxis.net/80805-ueberladen-von-function-geht-nicht.html)

EccoBravo 15. Nov 2006 16:00


Überladen von function geht nicht ?
 
Hallo,

ich will gerade ein TEdit schreiben, das mit verschiedenen Typen funktioniert.
Dabei habe ich Schwierigkeiten mit dem Überladen von Funktionen. In mir hegt sich das Unbehagen, daß das wohl nicht geht - ist das richtig?
Ich war der Annahme, daß verschiedene Rückgabetypen ähnlich funktionieren wie verschiedene Parameterlisten.
(BDS2006)

Anbei habe ich mal meinen Code eingefügt:
Delphi-Quellcode:
unit EB_Edit;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, Math;

type
  TEB_Edit = class(TEdit)
  private
    FWert: string;

    function GetWert:string; overload;
    procedure SetWert(const Value: string); overload;

    function GetWert:integer; overload;
    procedure SetWert(const Value: integer); overload;

    function GetWert:single; overload;
    procedure SetWert(const Value: single); overload;
    procedure SetWert(const Value: single;rn:integer); overload;

    { Private-Deklarationen }
  protected

  { Protected-Deklarationen }
  { Public-Deklarationen }
  { Published-Deklarationen }
  public

  published
    property Wert:string read FWert write SetWert;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('EB_Tools', [TEB_Edit]);
end;

{ TEB_Edit }

{ TEB_Edit }

function TEB_Edit.GetWert: string;
begin
  result := Text;
end;

procedure TEB_Edit.SetWert(const Value: string);
begin
  FWert := Value;
  Text:=FWert;
end;

function TEB_Edit.GetWert: integer;
begin
  result:= StrToInt(Text);
end;

procedure TEB_Edit.SetWert(const Value: integer);
begin
  FWert := IntToStr(Value);
  Text:=FWert;
end;

function TEB_Edit.GetWert: single;
begin
  result:= StrToFloat(Text);
end;

procedure TEB_Edit.SetWert(const Value: single);
begin
  FWert := FloatToStr(Value);
  Text:=FWert;
end;

procedure TEB_Edit.SetWert(const Value: single; rn: integer);
begin
  FWert := FloatToStr(roundTo(Value,-rn);
  Text:=FWert;
end;

end.
Hat nicht jemand da eine Idee?

Vielen Dank

E. B.

hanselmansel 15. Nov 2006 16:14

Re: Überladen von function geht nicht ?
 
Die Überladung funktioniert nur mit verschiedenen Parameterlisten, damit der Compiler die einzelnen Funktionen auseinander halten kann.

Panthrax 15. Nov 2006 16:34

Re: Überladen von function geht nicht ?
 
Hallo.

Zunächst: Es ist nicht möglich Get- und Set-Methoden zu überladen. Sie brauchen bzw. haben immer eindeutige Bezeichner.

Dann noch etwas zum Thema "Überladen von Routinen und Methoden": In der Tat ist es so, dass eine überladene Routine bzw. Methode nur anhand ihrer Parameterliste (ihre Signatur) identifiziert werden kann, wenn der Name gleich ist. Nicht anhand ihrer Rückgabe. Der Rückgabewert eine Funktion kann nicht Teil der Signatur sein, wenn man bedenkt, dass Funktionen wie Prozeduren aufgerufen werden können und dar Rückgabewert damit unbeachtet bleibt also auch nicht für einen Signaturvergleich herhalten kann.

Hier ist ein kleines Beispiel:
Delphi-Quellcode:
function F(const X: Integer):Integer; overload;
begin
  Result:=X+1;
end;

function F(const X: Extended): Extended; overload;
begin
  Result:=X-1;
end;

...

var
  ExtendedX: Extended;
  IntegerX: Integer;
  Y: Extended;
begin
  ExtendedX:=5;
  IntegerX:=5;
  { Verschiedene Aufrufvarianten, welche Funktion
  wird wohl verwendet werden? - Immer nach dem
  Grundsatz der Signatur, also der Parameterliste
  entscheiden. }
  Y:=F(IntegerX); // Y:=6;
  Y:=F(ExtendedX); // Y:=4;
  F(IntegerX); // vernachlässigte Rückgabe: 6
  F(ExtendedX); // vernachlässigte Rückgabe: 4
  IntegerX:=F(Y); // Compiler-Fehler: Inkompatible Typen 'Integer' und 'Extended'
end;
Gruß,
Panthrax.

[edit=Panthrax]Zahlendreher im Beispiel[/edit]


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