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?