Hello, I'm thinking about refactoring a program using the standard observer pattern, based on generics and simple non-COM interfaces. The problem is that FPC (either 2.6.4 or latest trunk) doesn't seem to accept the parameterized type to cast:
I've attached the full source as it's a simple console program test, however the subject class declaration looks like this, (ITF is the observer interface):
generic TGenericEmitter<ITF> = class(IInfoEmitter)
protected
fReceivers: TObjectList;
function acceptReceiver(aObject: TObject): boolean; virtual; // test for ITF
function getReceiver(index: Integer): ITF;
public
constructor create;
destructor destroy; override;
//
procedure updateReceivers; virtual;
procedure addReceiver(aReceiver: TObject);
procedure removeReceiver(aReceiver: TObject);
//
property receiver[index: integer]: ITF read getReceiver;
end;
and the implementation:
constructor TGenericEmitter.create;
begin
fReceivers := TObjectList.create(false);
end;
destructor TGenericEmitter.destroy;
begin
fReceivers.Free;
inherited;
end;
function TGenericEmitter.getReceiver(index: Integer): ITF;
begin
// ouch 1:Error: Class or interface type expected, but got "<undefined type>"
result := (fReceivers.Items[index] as ITF);
end;
function TGenericEmitter.acceptReceiver(aObject: TObject): boolean;
begin
// ouch 2:Error: Class or interface type expected, but got "<undefined type>"
result := (aObject as ITF) <> nil;
end;
procedure TGenericEmitter.addReceiver(aReceiver: TObject);
begin
if fReceivers.IndexOf(aReceiver) <> -1 then
exit;
if not acceptReceiver(aReceiver) then
exit;
fReceivers.Add(aReceiver);
end;
procedure TGenericEmitter.updateReceivers;
begin
end;
procedure TGenericEmitter.removeReceiver(aReceiver: TObject);
begin
fReceivers.Remove(aReceiver);
end;
What's the right syntax to get rid of those errors ?