سؤال

المتعلقة الأخير الأخير سؤال, ، لدي الآن المشكلة التالية:

function TNodeFactory <T>.CreateNode (ID : Integer) : INodeInterface <T>;
var
  NodeClass : TClass;
begin
  NodeClass := FindRegisteredClass (ID);
  Result := NodeClass.Create;      
end;

هذا ينتج خطأ مترجم:

E2010 Incompatible Types: 'INodeInterface<TNodeFactory<T>.T>' and 'TObject'

يلقي لا يعمل أيضا.

ما أنا في عداد المفقودين هنا؟

تحرير: التنفيذ الحالي

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;

(الشيكات المبسطة وإزالة الأخطاء)

هل كانت مفيدة؟

المحلول

المشكلة هي nodeclass كونها tclass. إذا قمت بإنشاء NodeClass، فسيكون مجرد TBject، وليس InodeInterface.

بامكانك ان تحاول

Result := TInterfacedObject(RegisteredType.NodeClass).Create as INodeInterface

أو تغيير تسجيل الدخول إلى

type
  TInterfacedObjectClass = class of TInterfacedObject;   
...   
procedure RegisteredNodeType...(ID: Integer; NodeClass : TInterfacedObjectClass);

والعودة

Result := RegisteredType.NodeClass.Create as INodeInterface. 

نصائح أخرى

تحتاج إلى استخدام الدالة الدعم () لاستخراج مرجع واجهة من كائن. ستجدها في sysutils.

هناك العديد من الإصدارات الزائدة، تريد إصدار المعلمة الثلاثة التي توفرها معلمة "خارج" ثالثة "مرجع واجهة".

في دلفي واجهة ليست كائن. ومؤشر الواجهة ليست موضوعية، ولهذا السبب لا يمكنك إلقاءها. تحتاج إلى استخدام QueryInterface واستعلام للواجهة.

function QueryInterface(var IID: TGUID; out Obj: Type):HRESULT

إذا كان HRESULT هو S_OK، فإن OBJ يحتوي على مرجع إلى الواجهة المستحقة.

واجهات Delphi (Win32) بشكل مؤسف تختلف عن .NET / Java.

اسمحوا لي أن أبدأ إجابتي مع هذا الإصحاب: أنا لست على دراية باستخدام القوالب في دلفي.

يمكنك الحصول على خطأ التحويل البرمجي لأنك تحاول إرجاع NoDeClass الذي تم تعريفه على أنه مثيل TCLASS. ومع ذلك، تتوقع الوظيفة منك إرجاع مثيل للفئة التي تنفذ inodeinterface. قد تكون قادرا على حل هذه المشكلة مع شيء مثل هذا

Result := INodeInterface(NodeClass.Create);     

أو

function TNodeFactory <T>.CreateNode (ID : Integer) : INodeInterface <T>;
var
  NodeClass : TClass;
  NodeInterface: INodeInterface;
begin
  NodeClass := FindRegisteredClass (ID);
  NodeInterface:= NodeClass.Create;
  Result := NodeInterface;      
end;

قد لا يكون هذا هو الإجابة الصحيحة ولكن آمل أن يساعدك هذا في قيادةك إلى الحل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top