lié à ma dernière question, j'ai maintenant le problème suivant:Cast de TObject à l'interface de type
function TNodeFactory <T>.CreateNode (ID : Integer) : INodeInterface <T>;
var
NodeClass : TClass;
begin
NodeClass := FindRegisteredClass (ID);
Result := NodeClass.Create;
end;
Cela donne une erreur du compilateur:
E2010 Incompatible Types: 'INodeInterface<TNodeFactory<T>.T>' and 'TObject'
Un casting ne fonctionne pas trop.
Qu'est-ce qui me manque ici?
EDIT: la mise en œuvre actuelle
TNodeFactory <T> = class
private
type
TRegisteredNodeType = record
ID : Integer;
NodeClass : TClass;
end;
private
FNodeTypeList : TList <TRegisteredNodeType>
public
procedure RegisterNodeType (ID : Integer; NodeClass : TClass);
function CreateNode (ID : Integer) : INodeInterface <T>;
end;
procedure TNodeFactory <T>.RegisterNodeType (ID : Integer; NodeClass : TClass);
var
RegisteredType : TRegisteredNodeType;
begin
RegisteredType.ID := ID;
RegisteredType.NodeClass := NodeClass;
FNodeTypeList.Add (RegisteredType);
end;
function TNodeFactory <T>.CreateNode (ID : Integer);
var
RegisteredType : TRegisteredNodeType;
begin
for RegisteredType in FNodeTypeList do
if (RegisteredType.ID = ID) then
Exit (RegisteredType.NodeClass.Create);
raise EInvalidNodeType.Create ('No node type with ID ' + IntToStr (ID) + ' registered');
end;
(contrôles d'erreur simplifiés et supprimés)
NodeClass est un TClass. Si vous créez NodeClass, ce sera simplement TObject et non INodeInterface. Vous devrez nous montrer votre implémentation de RegisterClass et FindRegisteredClass. –
ajouté implémentation à ma question – jpfollenius
Vous pouvez essayer * Résultat: = TInterfacedObject (RegisteredType.NodeClass) .Create comme INodeInterface * –