Ich will grad mal ein klein wenig zum Thema Interfaces "lernen" und habe mir dazu die angehänge Testapp gebastelt.
Im Anhang habe ich eine kleine Demo angehängt, die leider nicht "funktioniert", weil ich noch nicht genug gelernt habe :/
Worum es geht:
Ich habe 3 Classen TVehicle, TCar und TPlane die den Namen entsprechend "abgeleitet" sind.
Code: Alles auswählen
Unit uInterface_Example;
{$MODE ObjFPC}{$H+}
Interface
Uses
Classes, SysUtils;
Type
IInterface = Interface
Function CanFly: Boolean; virtual; abstract;
End;
{ TVehicle }
TVehicle = Class(TInterfacedObject)
private
public
Name: String;
Position: TPoint;
Constructor Create(); virtual;
End;
TCar = Class(TVehicle)
private
public
End;
TPlane = Class(TVehicle)
private
public
End;
{ TInterfacedVehicle }
TInterfacedVehicle = Class(TVehicle, IInterface)
Function CanFly: Boolean; virtual;
End;
{ TInterfacedCar }
TInterfacedCar = Class(TCar, IInterface)
public
Function CanFly: Boolean; virtual;
End;
{ TInterfacedPlane }
TInterfacedPlane = Class(TPlane, IInterface)
public
Function CanFly: Boolean; virtual;
End;
Implementation
{ TVehicle }
Constructor TVehicle.Create();
Begin
name := ClassName;
End;
{ TInterfacedVehicle }
Function TInterfacedVehicle.CanFly: Boolean;
Begin
result := false;
Raise exception.create(classname + '.CanFly not implemented.');
End;
{ TInterfacedCar }
Function TInterfacedCar.CanFly: Boolean;
Begin
result := false;
End;
{ TInterfacedPlane }
Function TInterfacedPlane.CanFly: Boolean;
Begin
result := true;
End;
End.
Im Beispiel habe ich dazu TInterfacedCar und TInterfacedPlane erzeugt.
Mein Problem ist nun, dass ich alle meine Vehicles in einer Variable sammeln will dazu habe ich
Code: Alles auswählen
var
MyVehicles: Array Of TInterfacedVehicle;
Wenn ich nun aber Instancen erstellen will meckert der Compiler:
Code: Alles auswählen
Procedure TForm1.Button1Click(Sender: TObject);
Begin
// Buy Car
setlength(MyVehicles, high(MyVehicles) + 2);
MyVehicles[high(MyVehicles)] := TInterfacedCar.Create(); // -- Das hier geht nicht
UpdateMyVehicles;
End;
Wie macht man das also Richtig ?