easyDelphi Q&A
+1 تصويت
25 مشاهدات

في هذا المثال مثلا

type
  TParent = class
    procedure MyMethod; virtual; abstract;
  end;

  TParentClass = class of TParent;

  TChildA = class(TParent)
    procedure MyMethod; override;
  end;

  TChildB = class(TParent)
    procedure MyMethod; override; final;
  end;

ما هو عمل كل من Virtual, override, final و  abstract

سُئل في تصنيف OOP بواسطة (1,630 نقاط) | 25 مشاهدات
 

1 إجابة واحدة

0 تصويتات

ال Virtual خاصية في تابع ضمن كلاس الاب superclass ، تتيح لك اشتقاق التابع في الكلاس الابن باستخدام override

بعض لغات البرمجة لا تتطلب لستخدام ال virtual ، فكل التوابع متاحة للاشتقاق، اما في الدلفي Delphi او الباسكال، في تتطلب ان تضيفها إلى التابع في الكلاس الاب، والا فلن تستيطع اشتقاقه، و الاشتقاق اقصده بمعنى اعادة كتابة الكود الخاص به، و يمكن طلب التابع الاصلي للأب باستخدام inherited

في حال قمت باشتقاقه في الابن TChild و أردت ايقاف عملية الاشتقاق، يعني لا تريد لكلاس اخر ان يشتق الابن و يشتق هذا التابع، نضيف خاصية اليه بعد ال override نضيف final ، هنا لايمكن لاحد ان يقوم باشتقاق التابع من الابن، يعني تعكس عمل virtual عند هذا الكلاس.

 

type
  TParent = class
    procedure Seek; virtual; abstract;
    procedure Find; virtual;
  end;

  TChild = class(TParent)
    procedure Seek; override;
    procedure Find; override;
  end;


//Parent

procedure TParent.Find;
begin
end;

//Child

procedure TChild.Seek;
begin

end;

procedure TChild.Find;
begin
	inherited;//call parent method
end;

اذا اردت عمل كلاس خاص بالاشتقاق، يعني هذا الكلاس الاب لا تريد استخدامه مباشرة لكن تريد استخدام الابناء له فقط، فأنت ستتكاسل عن كتابة جسم فارغ لهذا التابع، فيمكنك اضافة abstract للتابع، يعني اصبح هذا التابع بدون جسم كود، و بما انه ليس له جسم كود، لن تستطيع استخدامه، فأذا قمت باشتقاق الكلاس، و لم تشتق أو تكتب جسماً لهذا التابع، سيبب لك بعض مشاكل عند استدعاءه، الباسكال ستخبرك عن ذلك عند عمل كومبايل.

بمعنى اذا استعملت abstract في كلاس (اب) فحتما عند الاشتقاق عليك كتابة الجسم الخاص به، و حتما هذا الاب اصبح من الكلاسات التي يجب لا تنشيء instance او object منه مباشرة.

 

تستطيع وضع علامة abstract على الكلاس بالكامل، هنا الكومبايلر سيمنعك من انشاء instance/object منه مباشرة فهو مخصص للاشتقاق، لكن يمكن وضع توابع لها اجسام، او بدون كأي كلاس عادي.
 

type
  TMyClass = class abstract (TObject)
  end;

و تستطيع وضع علامة  final ولكن باستخدام كلمة (sealed) على الكلاس بالكامل فتمنع اشتقاق كامل الكلاس من الاصل، يعني فقط تستطيع انشاء objects منه.

type
  TMyClass = class sealed (TObject)
  end;

 

تم الرد عليه بواسطة (8,000 نقاط)
عُدل بواسطة

اسئلة متعلقة

+2 تصويتات
2 إجابة
سُئل أغسطس 11 في تصنيف OOP بواسطة KHALED (5,190 نقاط) | 53 مشاهدات
+2 تصويتات
1 إجابة
سُئل أغسطس 11 في تصنيف vcl بواسطة KHALED (5,190 نقاط) | 40 مشاهدات
+1 تصويت
1 إجابة
سُئل أغسطس 20 في تصنيف vcl بواسطة Yamada Fakir (1,040 نقاط) | 47 مشاهدات
+1 تصويت
2 إجابة
سُئل أغسطس 28 في تصنيف vcl بواسطة Yamada Fakir (1,040 نقاط) | 57 مشاهدات
+1 تصويت
1 إجابة
سُئل أغسطس 6 في تصنيف vcl بواسطة KHALED (5,190 نقاط) | 39 مشاهدات
ادعُ اصدقائك في الفايسبوك لمشاركتك

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

211 سؤال
399 إجابة
689 تعليق
118 مستخدم