انتظر..... حتى افرغ ما لدي بطريقة اخرى
هذا النقاش اللذيذ كما اشار الاخ امير يعجبني
وما دام الاخوة يقدمون الافضل و الاجمل لذا اصبح حق علي ان اشرح ما سبق بطريقتي
و اتمنى ان تعجبكم
الشرح استكمال لافكار كل الاخوة في المقال جزاهم الله كل خير و اثابهم الجنة.
مع توسع قليل من قبلي
اولا ان النوع abstract class يسمح بالتوريث من الكلاسات الاخرى (اي ترث منه الكلاسات الاخرى)
ولا يمكنك انشاء نسخة مباشرة منه instantiated.
ويجب الاشارة الى ان هذا النوع يجب ان يمتلك على الاقل واحدة او اكثر من الطرق المكتملة (اي تحتوي على كود ساسميه جسم الدالة)
و كذلك على الاقل طريقة واحدة غير مكتملة اي بدون جسم للدالة , و يجب تعريفها بالمحدد abstract
اذا كانت كل الطرق في الكلاس غير مكتملة عندها تصبح شبيهة بـ interface
ثانيا الواجهات Interface
يتم تعريفها بالكلمة المفتاحية interface و هي تحتوي على دوال غير مكتملة اي لاتحوي على جسم (تمهيد فقط)
اما عن الفائدة منها فهو في الكلاس التي ستطبق و تستفيد من هذه الطرق بعد ان تكون قد ورثت interface السابقة
و جميع الطرق و الخصائص داخل interface كما قال الاخ سجاد هي بشكل افتراضي عامة Puplic
ساقوم بالشرح وفق الاكواد لتسهيل المهمة و لاعطاء الشرح هدف واضح
طبعا انا ساكتب اكواد #C لان المقالة في هذا القسم بالتحديد (بالنسبة لاكواد #C انا اكتبها بحكم عملي على الجافا )
لننظر الى الكود التالي الذي يعرف كلاس بسيطة من النوع abstract Class
الكلاس بسيط يحتوي على حقلين مع خصائص لكل حقل ويحتوي على طريقة واحدة تعيد المجموع
و لدي ايضا interface يحتوي على خاصيتين و نفس الدالة السابقة
وجه الخلاف اننا لا نستطيع تعريف متغيرات بشكل مباشر ضمن interface كما اشار الاخ الشاكي سابقا
الان ساقوم بانشاء كلاس يقوم بتطبيق الواجهة Iproduct (سيتم تطبيق كل الخصائص و الطرق الموروثة هذا شرط اساسي)
هل رايت كيف تم توسيع الطرق و الخصائص (هكذا تستفيد من اعادة التطبيق )
الان اريد التطبيق على الكلاس Product و هو من النوع abstract Class
لدينا هنا كلاس جديد يقوم بوراثة الكلاس السابق Product و يعيد قيادة الطرق و الخصائص كما يلي
اصبح بامكاننا الاستفادة من هذا الكلاس في عملنا بشكل مباشر
بعد ذلك يمكننا انشاء نسخة جديدة من الكلاس السابق implementAbstract و استخدمها في تطبيقنا كما يلي
اماذا لو احببنا ان نستفيد من الكلاس implementInterface الذي قام بتطبيق الواجه Iproduct
نعم يمكننا ذلك كم عملنا سابقا انظر الكود
بقي ان اقول لك بان الاعضاء المشتركة المعرفة بالطريقة (Static) لا يمكن وراثتها تحت اي ظرف كان
لذا نحن لا نستطيع تعريفها داخل Interface .
بينما يمكنك تعريف طرق مشتركة داخل الكلاسات من النوع abstract Class
يمكننا اضافة الطريقة التالية الى الكلاس السابق Product
بينما لا يمكننا كتابتها في Interface
اوجه الخلاف بين Abstract Class و Interfaces
بقي الحديث عن Sealed Class
ليتضح معنى Sealed Class انظر معي لهذا الكلاس
لا يمكن اعتبار هذا النوع فئة قاعدية (Base Class) و ليست ايضا من النوع Abstract Class
هي تستخدم تحديدا لمنع اعادة اشتقاقها
و لانها ليست فئة قاعدية فان بعض معالجات النظام تستخدمها لتسريع عمليات الوصول الى الاعضاء بداخلها
لا يمكنك اعادة اشتقاقها و ايضا لا يمكنك اعادة قيادة الطرق بداخلها و لا يمكنك وراثتها ايضا
كيف يمكنني استخدامها اذاً , بكل بساطة انشأ نسخة منها و اسند القيم و استخدم الطرق بداخلها كما هي
بقي السؤال المطروح ايهما استخدم
هذا النقاش اللذيذ كما اشار الاخ امير يعجبني
وما دام الاخوة يقدمون الافضل و الاجمل لذا اصبح حق علي ان اشرح ما سبق بطريقتي
و اتمنى ان تعجبكم
الشرح استكمال لافكار كل الاخوة في المقال جزاهم الله كل خير و اثابهم الجنة.
مع توسع قليل من قبلي
اولا ان النوع abstract class يسمح بالتوريث من الكلاسات الاخرى (اي ترث منه الكلاسات الاخرى)
ولا يمكنك انشاء نسخة مباشرة منه instantiated.
ويجب الاشارة الى ان هذا النوع يجب ان يمتلك على الاقل واحدة او اكثر من الطرق المكتملة (اي تحتوي على كود ساسميه جسم الدالة)
و كذلك على الاقل طريقة واحدة غير مكتملة اي بدون جسم للدالة , و يجب تعريفها بالمحدد abstract
اذا كانت كل الطرق في الكلاس غير مكتملة عندها تصبح شبيهة بـ interface
ثانيا الواجهات Interface
يتم تعريفها بالكلمة المفتاحية interface و هي تحتوي على دوال غير مكتملة اي لاتحوي على جسم (تمهيد فقط)
اما عن الفائدة منها فهو في الكلاس التي ستطبق و تستفيد من هذه الطرق بعد ان تكون قد ورثت interface السابقة
و جميع الطرق و الخصائص داخل interface كما قال الاخ سجاد هي بشكل افتراضي عامة Puplic
ساقوم بالشرح وفق الاكواد لتسهيل المهمة و لاعطاء الشرح هدف واضح
طبعا انا ساكتب اكواد #C لان المقالة في هذا القسم بالتحديد (بالنسبة لاكواد #C انا اكتبها بحكم عملي على الجافا )
لننظر الى الكود التالي الذي يعرف كلاس بسيطة من النوع abstract Class
PHP كود :
public abstract class Product
{
//fields
protected string id;
protected double price;
//properties
public abstract string ID
{
get;
set;
}
public abstract double Price
{
get;
set;
}
public abstract double CalculatePrice();
}
الكلاس بسيط يحتوي على حقلين مع خصائص لكل حقل ويحتوي على طريقة واحدة تعيد المجموع
و لدي ايضا interface يحتوي على خاصيتين و نفس الدالة السابقة
PHP كود :
public interface Iproduct
{
string ID
{
get;
set;
}
double Price
{
get;
set;
}
double CalculatePrice();
}
وجه الخلاف اننا لا نستطيع تعريف متغيرات بشكل مباشر ضمن interface كما اشار الاخ الشاكي سابقا
الان ساقوم بانشاء كلاس يقوم بتطبيق الواجهة Iproduct (سيتم تطبيق كل الخصائص و الطرق الموروثة هذا شرط اساسي)
PHP كود :
public class implementInterface: Iproduct
{
protected string id;
protected double price;
public string ID
{
get
{
return id;
}
set
{
id = value;
}
}
public double price
{
get
{
return price;
}
set
{
price = value;
}
}
public double CalculatePrice()
{
return Price * 1.25;
}
هل رايت كيف تم توسيع الطرق و الخصائص (هكذا تستفيد من اعادة التطبيق )
الان اريد التطبيق على الكلاس Product و هو من النوع abstract Class
لدينا هنا كلاس جديد يقوم بوراثة الكلاس السابق Product و يعيد قيادة الطرق و الخصائص كما يلي
PHP كود :
public class implementAbstract: Product
{
public override string ID
{
get
{
return id;
}
set
{
id = value;
}
}
public override double Price
{
get
{
return price;
}
set
{
price = value;
}
}
public override double CalculatePrice
{
return Price * 1.25;
}
}
اصبح بامكاننا الاستفادة من هذا الكلاس في عملنا بشكل مباشر
بعد ذلك يمكننا انشاء نسخة جديدة من الكلاس السابق implementAbstract و استخدمها في تطبيقنا كما يلي
PHP كود :
ImplementAbstract testAbstract = New implementAbstract();
testAbstract.ID="A1";
testAbstract.Price=1000.00;
Double amt = testAbstract.CalculatePrice();
Response.Write("المجموع الصافي : " + " " +testAbstract.ID +" "+ "is"+" "+amt);
Response.Write("<br>");
اماذا لو احببنا ان نستفيد من الكلاس implementInterface الذي قام بتطبيق الواجه Iproduct
نعم يمكننا ذلك كم عملنا سابقا انظر الكود
PHP كود :
ImplementInterface testInterface = New implementInterface();
testInterface.ID="B1";
testInterface.Price=900.00;
Double Iamt = testInterface.CalculatePrice();
Response.Write("المجموع الصافي : " +" "+testInterface.ID +" "+ "is"+" "+Iamt);
Response.Write("<br>");
بقي ان اقول لك بان الاعضاء المشتركة المعرفة بالطريقة (Static) لا يمكن وراثتها تحت اي ظرف كان
لذا نحن لا نستطيع تعريفها داخل Interface .
بينما يمكنك تعريف طرق مشتركة داخل الكلاسات من النوع abstract Class
يمكننا اضافة الطريقة التالية الى الكلاس السابق Product
PHP كود :
public static void test()
{
}
بينما لا يمكننا كتابتها في Interface
اوجه الخلاف بين Abstract Class و Interfaces
- Abstract Class يمكن ان تحتوي على طرق كا ملة و غير كاملة , بينما Interfaces لا تحتوي الا على طرق غير مكتملة فقط تمهيد للطرق بدون كود في جسم الدالة,لذا فان Abstract Class تستطيع تطبيق الطرق (implement) بينما Interface لا تستطيع ذلك.
- Abstract Class يمكن ان تحتوي على متغيرات (حقول) , مشيدات , مهدمات - بينما Interfaces لا يمكن تحتوي على ما سبق .
- Abstract Class لا تدعم الوراثة المتعددة , بينما Interfaces تدعم ذلك بقوة , اذ يمكنك ان تقوم بوراثة اكثر من Interfaces في نفس الكلاس مع امكانية ورائة كلاس فقط .
- عندما ترث من Interface سيكون لزاما عليك تطبيق كل الطرق و الخصائص التي بداخل الـ Interface , بينما انت لست ملزما بتطبيق او اعادة قيادة كل الطرق عندما ترث من النوع Abstract Class.
- محددات الوصول مثل (Private,Public,Protected,internal,virtual) تستطيع استخدامها مع Abstract Class , و العكس ليس صحيح مع Interface .
- اخيرا Abstract Class اسرع في التعامل من Interface .
بقي الحديث عن Sealed Class
ليتضح معنى Sealed Class انظر معي لهذا الكلاس
PHP كود :
public sealed class classSealed
{
public string ID;
public double Price;
}
لا يمكن اعتبار هذا النوع فئة قاعدية (Base Class) و ليست ايضا من النوع Abstract Class
هي تستخدم تحديدا لمنع اعادة اشتقاقها
و لانها ليست فئة قاعدية فان بعض معالجات النظام تستخدمها لتسريع عمليات الوصول الى الاعضاء بداخلها
لا يمكنك اعادة اشتقاقها و ايضا لا يمكنك اعادة قيادة الطرق بداخلها و لا يمكنك وراثتها ايضا
كيف يمكنني استخدامها اذاً , بكل بساطة انشأ نسخة منها و اسند القيم و استخدم الطرق بداخلها كما هي
PHP كود :
classSealed sc=new classSealed();
sc.ID="C1";
sc.Price=500.00;
double Samt=sc. CalculatePrice();
بقي السؤال المطروح ايهما استخدم
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال


