Einzelnen Beitrag anzeigen

EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Verwendung von Interface - Verständnisfrage

  Alt 13. Mär 2022, 13:13
Delphi-Version: 10.4 Sydney
nachdem ich mir das Thema Interface festigend nochmals vorgenommen habe, stelle ich nachfolgend meine Überlegungen in den Raum und bitte zugleich um Eure
Meinung dazu.
Ich nutze eine einfache Berechnung eines Flächeninhaltes und des Umfangs eines Rechtecks als Übungsbeispiel.
Dazu der Auszug aus der unit logic:

Delphi-Quellcode:
type
   TFlaeche = class(TInterfacedObject, ITextValue)
    private
     FLaenge : int32;
     FBreite : int32;
     FFlaeche: int32;
     procedure setLaenge(L:Int32);
     procedure setBreite(B:Int32);
     function GetFlaeche: int32;
    public
      constructor create;
      property Laenge : int32 read FLaenge write FLaenge;
      property Breite : int32 read FBreite write FBreite;
      property Flaeche : int32 read GetFlaeche write FFlaeche;
   end;

type
    TUmfang = class(TInterfacedObject, ITextValue)
      private
        FUmfang: Int32;
        FBreite: int32;
        FLaenge: int32;
      public
        constructor create;
        function GetUmfang: int32;
        function GetFlaeche : Int32;
        procedure SetLaenge(L:int32);
        procedure SetBreite(B:int32);
        property Laenge : int32 read FLaenge write FLaenge;
        property Breite : int32 read FBreite write FBreite;
        property Umfang: int32 read GetUmfang write FUmfang;
    end;
Zugleich habe ich ein Interface in einer gesonderten unit unitInterf deklariert:

Delphi-Quellcode:
type
  ITextValue = interface
    ['{14E563E8-1AE9-41F2-B362-C48D4D0AE8A0}']
    procedure SetLaenge(L : Int32);
    procedure SetBreite(B : Int32);
    function GetFlaeche : int32;
  end;
Da ich in diesem Interface keine Felder deklarieren darf, habe ich ein kleines Problem bei der Zuweisung der Felder im Hauptprogramm, wenn ich
MyFlaeche und MyUmfang mit ITextValue (also dem Interface) referenziere, denn ich soll ja nicht TFlaeche oder TUmfang als Referenz verwenden.
Mit der Zuweisung an das Interface ITextValue wird doch auch die Referenzzählung gelöst.
So habe ich das Problem mal ganz kühn mit einem Cast gelöst:

Delphi-Quellcode:
...
private
    MyFlaeche : ITextValue;//TFlaeche; Variablenzuweisung an ITextValue
    MyUmfang : ITextValue;//TUmfang;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
  (MyFlaeche as TFlaeche).Laenge:=StrToInt(edtLaenge.text); //Input für Länge //Cast
  (MyFlaeche as TFlaeche).Breite:=StrToInt(edtBreite.text); //Input für Breite
  lblErgFl.caption := inttostr((MyFlaeche as TFlaeche).Flaeche);
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
  (MyUmfang as TUmfang).Laenge:=strtoint(edtLaenge.text);
  (MyUmfang as TUmfang).Breite:=strtoint(edtBreite.text);
  lblErgUmfang.Caption:=inttostr((MyUmfang as TUmfang).Umfang);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyFlaeche:=TFlaeche.create;
  MyUmfang:=TUmfang.create;
end;
Meine Fragen:
1. ist das so richtig so oder zu umständlich?
2. würde ich MyFlaeche: TFlaeche und MyUmfang: TUmfang (also der Klasse) zuweisen würde ich zwar den Cast vermeiden, jedoch müsste ich dann auch die Objecte wieder selbst freigeben,
also hätte ich den Vorteil der Referenzzählung durch Interface eingebüßt, obwohl TFlaeche = class(TInterfacedObject, ITextValue) ja TInterfacedObject, ITextValue enthält.
3. ist es richtig bei Verwendung von Interfaces stets eine Referenz auf Interfaces zu verwenden statt auf die Klasse oder ist das egal?
Norbert
  Mit Zitat antworten Zitat