overload mit gleichnamigen Typen aus unterschiedlichen Units

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Lemmy
Beiträge: 63
Registriert: Do 23. Feb 2017, 06:18

overload mit gleichnamigen Typen aus unterschiedlichen Units

Beitrag von Lemmy »

Servus,

ich habe folgendes Problem:

Code: Alles auswählen

  TForm1 = class(TForm)
  private

  public
    procedure bar(const Afoo: Unit_a.TFoo); overload; virtual; abstract;
    procedure bar(const Afoo: Unit_b.TFoo); overload; virtual; abstract;
  end; 
 
Lazarus sagt mir dann:

Error: Asm: Duplicate label UNIT1/home/lemmy/fpcdeluxe/L_2.2.x/fpc/bin/x86_64-linux/fpcTFORM1_$__$$_BAR$TFOO


Ok, verstehe ich, nur kann ich das Problem irgend wie lösen?

Grund für den seltsamen Code: Ich habe hier ne ältere Anwendung, die ich pflege und ich müsste ein paar grundlegende Dinge ändern, muss das aber halt am offenen Herzen machen, d.h. ein Teil nach dem anderen ersetzen, damit die Baustellen die ich aufmache nicht zu viele werden...

Mathias
Beiträge: 6902
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: overload mit gleichnamigen Typen aus unterschiedlichen Units

Beitrag von Mathias »

Ich vermute, das Unit_a.TFoo & Unit_B.TFoo die gleichen Typen sind.
Dafür müsste man die Deklaration sehen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Soner
Beiträge: 724
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: overload mit gleichnamigen Typen aus unterschiedlichen Units

Beitrag von Soner »

So ist es möglich:

Code: Alles auswählen

  TFooa= unit_a.TFoo;
  TFoob= unit_b.TFoo; 

  TForm1 = class(TForm)
  private

  public
    procedure bar(const Afoo: TFooa); overload; virtual; abstract;
    procedure bar(const Afoo: TFoob); overload; virtual; abstract;
  end; 

Soner
Beiträge: 724
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: overload mit gleichnamigen Typen aus unterschiedlichen Units

Beitrag von Soner »

Was Mattias sagt kann auch stimmen, ich habe es, so wie es du gemacht hast getest, es funktioniert auch:

Code: Alles auswählen

//unit1.pas ----------------------------------------------
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, unit2, unit3;

type
  TFoo2= unit2.TFoo;
  TFoo3= unit3.TFoo;

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure Bar(const AFoo: TFoo2);overload; virtual;
    procedure Bar(const AFoo: TFoo3);overload; virtual;

    //das funktioniert auch:
    //procedure Bar(const AFoo: unit2.TFoo);overload; virtual;
    //procedure Bar(const AFoo: unit3.TFoo);overload; virtual;    
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Bar(1);
  Bar('Str');
end;

procedure TForm1.Bar(const AFoo: TFoo2);
begin
  Caption:=caption+Afoo;
end;

procedure TForm1.Bar(const AFoo: TFoo3);
begin
  Caption:=caption+Afoo.ToString;
end;

end.  

//unit2.pas -----------------------------------------------------
unit Unit2;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils;

type
  TFoo= string;

implementation

end.  

//unit3.pas --------------------------------------------------------------
unit Unit3;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils;
type
  TFoo= integer;
implementation

end.             


Lemmy
Beiträge: 63
Registriert: Do 23. Feb 2017, 06:18

Re: overload mit gleichnamigen Typen aus unterschiedlichen Units

Beitrag von Lemmy »

Soner hat geschrieben: So 22. Sep 2024, 08:37 So ist es möglich:
super, vielen Dank, das sieht gut aus!

@Mathias: nein sind nicht die gleichen Typen, sonst müsste ich ja nicht überladen. Heißen halt leider identisch.

Antworten