كيف يتم التنقل في شجرة الوراثة بإستخدام inherited ؟
#1
Information 
السلام عليكم ورحمة الله تعالى وبركاته

نص المشكلة : 
قمت بإنشاء 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;

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

من الأفضل أيضا لو تعمل بكلاسات يحتمل استخدامها وليس TClassA TClassB وتبين الغرض من وراء مثالك حتى لا يكون عشوائيا.
الرد
#3
جرب الكود التالي 
كود :
constructor TClassC.Create; begin   TClassA(Self).GetInfo; end;
الرد
#4
هذه تعمل, لكن حتى مع أي كلاس خارجية مادام لديهم اجراء بنفس الاسم, وليست مرتبط بالوراثة, مثلا هذه الكلاس العشوائية:
PHP كود :
  TRandomClass = class
  public
    procedure GetInfo;
  end; 

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

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

يشتغل مع أنهم غير مرتبطين مع بعضهم.
الرد
#5
بارك الله فيكم أخواني سفيان و ghostdz

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

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

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


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم