03-07-16, 04:39 AM
(آخر تعديل لهذه المشاركة : 03-07-16, 05:10 AM {2} بواسطة الشاكي لله.)
معلومة مفيدة اخي خضر ..
واضيف كذلك انه عند تعريف Abstract Class وClass عادية مشتقة من الـ Abstract بهذا الشكل:
لو عرفنا Instance من الAbstract class بواسطة طريقة الPointing (كما ذكر اخونا خضر في المشاركة السابقة) ،
ثم لو قمنا بالاستعلام عن الType بهذا الشكل
الـ Type المرجع سيكون Ahmed وليس Name ، ذلك بسبب ان الـ Interface والـ Abstract في حالة الPointing، كلاهما يقومان بإرجاع الـ Concrete type
وفي مثاالنا اعلاه الـ Concrete type هو Ahmed بسبب ان الـ Instance مشار اليه بواسطة متغير من نوع Abstract
--
ومع ذلك ، عند استخدام المقارنة بالـ Type بواسطة المعامل Is .. سنجد ان الرسالتين في الاسفل سيتم طباعتهما :
نعم ، المعامل Is يرجع True سواء قارنت الـ object بالـ concrete class او بالـ Abtract class
طبعا نفس الموضوع بالضبط يحصل عند استخدام الانترفيس
واضيف كذلك انه عند تعريف Abstract Class وClass عادية مشتقة من الـ Abstract بهذا الشكل:
PHP كود :
//abstract
abstract class Name
{
}
//normal class (inherts from Name)
class Ahemd : Name
{
}
لو عرفنا Instance من الAbstract class بواسطة طريقة الPointing (كما ذكر اخونا خضر في المشاركة السابقة) ،
PHP كود :
Name n = new Ahemd();
ثم لو قمنا بالاستعلام عن الType بهذا الشكل
PHP كود :
Name n = new Ahemd();
MessageBox.Show( n.GetType().Tostring() );//will return the concrete class (which is Ahmed)
الـ Type المرجع سيكون Ahmed وليس Name ، ذلك بسبب ان الـ Interface والـ Abstract في حالة الPointing، كلاهما يقومان بإرجاع الـ Concrete type
وفي مثاالنا اعلاه الـ Concrete type هو Ahmed بسبب ان الـ Instance مشار اليه بواسطة متغير من نوع Abstract

--
ومع ذلك ، عند استخدام المقارنة بالـ Type بواسطة المعامل Is .. سنجد ان الرسالتين في الاسفل سيتم طباعتهما :
PHP كود :
Name n = new Ahemd();
if (n is Name)
{
MessageBox.Show("Hi"); //will be printed
}
if (n is Ahemd)
{
MessageBox.Show("Hi"); //will be printed
}
نعم ، المعامل Is يرجع True سواء قارنت الـ object بالـ concrete class او بالـ Abtract class
طبعا نفس الموضوع بالضبط يحصل عند استخدام الانترفيس

