تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
[نقاش] الفرق بين الـ Interface , Abstract Class , Base Class , Sealed Class
#9
انتظر..... حتى افرغ ما لدي بطريقة اخرى 
هذا النقاش اللذيذ كما اشار الاخ امير يعجبني 
وما دام الاخوة يقدمون الافضل و الاجمل لذا اصبح حق علي ان اشرح ما سبق بطريقتي  Big Grin
 و اتمنى ان تعجبكم

الشرح استكمال لافكار كل الاخوة في المقال جزاهم الله كل خير و اثابهم الجنة.

مع توسع قليل من قبلي

اولا ان النوع   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 implementInterfaceIproduct
{
 
 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 implementAbstractProduct
{
 
 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=scCalculatePrice(); 

بقي السؤال المطروح ايهما استخدم
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}


الردود في هذا الموضوع
RE: [مقال] متى استخدم الـ Interface ومتى استخدم الـ Class - بواسطة ابو ليلى - 30-06-16, 02:35 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [نقاش] نقاش حول تطبيق الفاتورة الإلكترونية فى السعودية المرحلة الثانية Zatca Integration AmrSobhy 3 3,033 22-05-25, 03:49 AM
آخر رد: abuarab
  تعلم Interface Abu Ehab 1 2,353 19-02-18, 10:38 PM
آخر رد: sendbad100
  KeyValuePair Class Abu Ehab 1 2,240 16-12-17, 06:08 PM
آخر رد: sendbad100
  ZipFile Class Abu Ehab 1 2,448 18-11-16, 03:44 AM
آخر رد: abulayth
  [نقاش] الـ Delegate الشاكي لله 11 10,058 01-09-16, 02:27 AM
آخر رد: أبو عمر
  [C#.NET] الفرق بين #String And String Builder c Devahmedsalim 3 4,845 15-09-13, 05:50 PM
آخر رد: sooriaty03
  Tips and Tricks : الفرق بين const و static readonly RaggiTech 0 3,538 14-10-12, 03:05 PM
آخر رد: RaggiTech
  الفرق بين التعريف باستخدام overridde و new RaggiTech 0 3,073 14-10-12, 02:57 PM
آخر رد: RaggiTech

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


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