delphi4arab منتديات دلفي للعرب
كيف يتم التنقل في شجرة الوراثة بإستخدام inherited ؟ - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : كيف يتم التنقل في شجرة الوراثة بإستخدام inherited ؟ (/showthread.php?tid=11003)



كيف يتم التنقل في شجرة الوراثة بإستخدام inherited ؟ - MasteranyOne - 12-08-2020

السلام عليكم ورحمة الله تعالى وبركاته

نص المشكلة : 
قمت بإنشاء 3 class كما يلي :
1- class A
2- class B ترث من class A
3- class C ترث من class B

وكل وحدة تحتوي على المنهاج GetInfo خاصة بها, كما هو موضح في الكود التالي :
كود :
unit uClass; interface uses Vcl.dialogs; type   TClassA = class(TObject)     public       procedure GetInfo;   end;   TClassB = class(TClassA)     public       procedure GetInfo;   end;   TClassC = class(TClassB)     public       constructor Create;       procedure GetInfo;   end; implementation { TClassC } constructor TClassC.Create; begin   inherited GetInfo; end; procedure TClassC.GetInfo; begin   ShowMessage('GetInfo for Class C'); end; { TClassB } procedure TClassB.GetInfo; begin   ShowMessage('GetInfo for Class B'); end; { TClassA } procedure TClassA.GetInfo; begin   ShowMessage('GetInfo for Class A'); end; end.

الإشكالية : في المنهاج create الخاص بال class C اردت إستدعاء المنهاج GetInfo الخاص بال class A
إستعملت الكود التالي, لكن ينفذ GetInfo الخاص بـ class B
كود :
constructor TClassC.Create;
كود :
begin
كود :
  inherited GetInfo;
كود :
end;


قمت بالتلاعب وستعملت هذا الكود لكن يظهر خطأ
كود :
constructor TClassC.Create; begin   inherited inherited GetInfo; end;

فكيف السبيل لفعل هذا؟؟


RE: كيف يتم التنقل في شجرة الوراثة بإستخدام inherited ؟ - sofiane201 - 12-08-2020

وعليكم السلام ورحمة الله.
أخ MasteranyOne, من الأفضل مراجعة كتاب أو مرجع جيد لدروس OOP, خاصة جانب Polymorphism الذي يبدو أن لديك اشكالا فيه.
لو تقرأ لن تجد استخداما للوراثة بهذا الشكل, يمكن ان يكون هناك حل لكنه غير مرغوب, ثم ان هناك مبادئ في مجال oop يجب الالتزام بها حتى لا يكون لديك تشويش فيه.

من الأفضل أيضا لو تعمل بكلاسات يحتمل استخدامها وليس TClassA TClassB وتبين الغرض من وراء مثالك حتى لا يكون عشوائيا.


RE: كيف يتم التنقل في شجرة الوراثة بإستخدام inherited ؟ - ghostdz - 13-08-2020

جرب الكود التالي 
كود :
constructor TClassC.Create; begin   TClassA(Self).GetInfo; end;



RE: كيف يتم التنقل في شجرة الوراثة بإستخدام inherited ؟ - sofiane201 - 13-08-2020

هذه تعمل, لكن حتى مع أي كلاس خارجية مادام لديهم اجراء بنفس الاسم, وليست مرتبط بالوراثة, مثلا هذه الكلاس العشوائية:
PHP كود :
  TRandomClass = class
  public
    procedure GetInfo;
  end; 

وفي constructor الخاص ب TClassC:

PHP كود :
TRandomClass(self).GetInfo; 

يشتغل مع أنهم غير مرتبطين مع بعضهم.


RE: كيف يتم التنقل في شجرة الوراثة بإستخدام inherited ؟ - MasteranyOne - 14-08-2020

بارك الله فيكم أخواني سفيان و ghostdz

بالنسبة لـ OOP بماذا تنصحوني لكي اتمكن منها.

بالنسبة للكود :
كود :
  TClassA(Self).GetInfo;

ما تفسير هذه الظاهرة ؟ مع ان المنهاج GetInfo ليس منهاج خاص بالـ class.