يلقي من tobject إلى نوع الواجهة
-
11-09-2019 - |
سؤال
المتعلقة الأخير الأخير سؤال, ، لدي الآن المشكلة التالية:
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;
قد لا يكون هذا هو الإجابة الصحيحة ولكن آمل أن يساعدك هذا في قيادةك إلى الحل.