with - oop c# شرح




لماذا يجب أن أذهب لواجهات في C#عندما أتمكن من تنفيذ الأساليب مباشرة (9)

أعتقد أن الكثير من الدماء قد انسكب بالفعل في طرح هذه الأسئلة ، ويحاول العديد حل هذه القضايا عن طريق شرح مصطلحات شبيهة بالإنسان لا يمكن لأي إنسان عادي أن يفهمها.

لذلك أولا. لمعرفة لماذا واجهة ولماذا تحتاج إلى معرفة ما هي لهم. تعلمت أنا personnaly هذا اثنين عند تطبيق فئة المصنع. تجد تعليمي جيد على هذا الرابط

الآن دعنا حفر القاعدة على الرابط الذي أعطيته بالفعل.

لديك فئة السيارة التي قد تتغير حسب متطلبات المستخدم (مثل إضافة شاحنة ، دبابة ، طائرة ، إلخ. ومقدمة لدينا

public class clsBike:IChoice
{
   #region IChoice Members
    public string Buy()
    {
       return ("You choose Bike");
    }
    #endregion
}

و

public class clsCar:IChoice
{
   #region IChoice Members
    public string Buy()
    {
       return ("You choose Car");
    }
    #endregion
}

وكلاهما لديه عقد ICHOICE التي تقول ببساطة يجب أن يكون لدى My Class Buy طريقة

public interface IChoice
{
    string Buy();
}

الآن ، كما ترى ، تقوم هذه الواجهة بتطبيق طريقة Buy() ولكن تسمح للفئة الموروثة بتحديد ما يجب فعله عند تنفيذها. هذا هو الحد من واجهة ، باستخدام واجهة محضة ، قد ينتهي بك الأمر تكرار بعض المهام التي يمكن أن تنفذ تلقائيا باستخدام abstact. على سبيل المثال ، دعنا نقول ، شراء كل سيارة لديه خصم.

public abstract class Choice
{
    public abstract string Discount { get; }
    public abstract string Type { get; }
    public string Buy()
    {
       return "You buy" + Type + " with " + Discount;
}
public class clsBike: Choice
{
    public abstract string Discount { get { return "10% Discount Off"; } }
    public abstract string Type { get { return "Bike"; } }
}

public class clsCar:Choice
{
    public abstract string Discount { get { return " $15K Less"; } }
    public abstract string Type { get { return "Car"; } }
}

الآن باستخدام "فئة المصنع" ، يمكنك تحقيق نفس الشيء ولكن في استخدام الخلاصة ، يمكنك السماح للفئة الأساسية بتنفيذ الأسلوب Buy() .

في الخلاصة: تسمح العقود البينية لطبقة الوراثة بتنفيذ التنفيذ بينما قد تقوم العقود المجردة بتهيئة التنفيذ (الذي يمكن أن يلغيه بواسطة فئة وراثة)

أنا على علم بأن هذا سؤال أساسي للغاية ، ولكن سألني أحد المحاورين بطريقة خدعة للغاية وكنت عاجزًا :(

أعرف فقط التعريف المادي أو النظري للواجهة وقمت بتنفيذها أيضًا في العديد من المشاريع التي عملت عليها. لكني لا أفهم لماذا وكيف يفيد ذلك.

أنا أيضا لا أفهم شيئا واحدا في الواجهة. أي على سبيل المثال ، نحن نستخدم

conn.Dispose(); في النهاية كتلة. لكنني لا أرى أن هذا الصف يقوم بتنفيذ أو توريث فئة واجهة ( SqlConnection ) SqlConnection IDisposable . أنا أتساءل كيف يمكنني فقط استدعاء اسم الأسلوب. أيضا في نفس الشيء ، أنا لا أفهم كيف يعمل أسلوب التخلص كما ، لأننا نحتاج إلى تنفيذ هيئة الوظيفة مع تنفيذنا الخاص لجميع أساليب الواجهة. إذن كيف يتم قبول الواجهات أو تسمية العقود؟ هذه الأسئلة ظلت تدور في ذهني حتى الآن وبصراحة لم أر أي موضوع جيد يشرح أسئلتي بطريقة أستطيع فهمها.

MSDN كالمعتاد تبدو مخيفة للغاية ولا يوجد خط واحد واضح هناك ( فالأفراد ، يرجى التكرم بأن يكونوا في مستوى عال من التطور ، أشعر بقوة أن أي كود أو مقالة يجب أن تصل إلى ذهن أي شخص يراها ، وبالتالي مثل العديد من الآخرين يقولون ، MSDN ليس من الاستخدام ).

قال الباحث:

لديه 5 طرق ويسعد بتطبيقها في الصف مباشرة ، ولكن إذا كان عليك الذهاب إلى فصل دراسي أو الواجهة ، ما هو الذي تختاره ولماذا؟ لقد أجبت عليه جميع المواد التي قرأتها في المدونة المختلفة التي تقول: ميزة وفائدة كل من الطبقة المجردة والواجهة ، لكنه غير مقتنع ، إنه يحاول فهم "لماذا الواجهة" بشكل عام. "لماذا الطبقة المجردة" بشكل عام حتى لو كان بوسعي تنفيذ نفس الأساليب مرة واحدة فقط وليس تغييرها.

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


تسمح الواجهات لمصمم الصف لجعل الطرق المتاحة واضحة للغاية للمستخدم النهائي. هم أيضا جزء لا يتجزأ من تعدد الأشكال.


في كلمة واحدة - بسبب تعدد الأشكال !

إذا كنت "Program to Interface، not an Implementation" مما يمكنك حقن كائنات مختلفة تشترك في نفس الواجهة (type) في الأسلوب كوسيطة. بهذه الطريقة لا يقترن كود الطريقة بأي تطبيق لفئة أخرى مما يعني أنه دائمًا ما يكون مفتوحًا للعمل مع كائنات تم إنشاؤها حديثًا من نفس الواجهة. (فتح / إغلاق المبدأ)

  • نظرة على حقن التبعية وقرأت بالتأكيد أنماط التصميم - عناصر من البرامج الموجهة للكائنات القابلة لإعادة الاستخدام من قبل GOF.

كل من الطبقة المجردة والواجهة هي عقود.

فكرة العقد هي أنك تحدد بعض السلوك. إذا كنت تقول أنك قد نفذت ، فهذا يعني أنك وافقت على العقد.

اختيار المجرد على interrface هو.

أي سليل غير مجردة من الطبقة المجردة سيتم تنفيذ العقد.

مقابل

أي فئة تقوم بتنفيذ الواجهة ستنفذ العقد.

لذا ، فإنك تستخدم الملخص عندما تريد تحديد سلوك ما يجب على جميع الأحفاد تنفيذه وحفظ نفسك في تحديد واجهة منفصلة ، ولكن يجب أن يكون كل ما يفي بهذا العقد المجمع بفاعلية هو سليل.


لن أقوم بنشر تعريف واجهة ضد فئة مجردة لأنني أعتقد أنك تعرف جيدًا النظرية وأفترض أنك تعرف مبادئ SOLID لذا دعنا نتمرن.

كما تعلمون ، لا يمكن أن تحتوي أي واجهات على أي شفرة ، لذا فإن فهمها سهل للغاية.

إذا كنت بحاجة إلى تهيئة خاصية صفك وتوفير منشئ أو تريد توفير جزء من التنفيذ ، فستكون فئة الملخص مناسبة بشكل جيد مقابل واجهة لا تسمح لك بذلك.

بشكل عام جدا يجب أن تفضل الطبقة المجردة إلى واجهات عندما تحتاج إلى توفير منشئ أو أي رمز للعميل الذي سيرث / يمد صفك


مع واجهة يمكنك القيام بما يلي:

1) إنشاء واجهات فصل التي تقدم تخفيضات مختلفة من التنفيذ الخاص بك ، مما يتيح واجهة أكثر تماسكا.

2) السماح لطرق متعددة بنفس الاسم بين الواجهات ، لأن يا ، ليس لديك أي تعارض في التنفيذ ، مجرد توقيع.

3) يمكنك إصدار وتشغيل الخلية خارج واجهتك بشكل مستقل عن التنفيذ ، مما يضمن الوفاء بالعقد.

4) يمكن أن تعتمد التعليمات البرمجية الخاصة بك على التجريد بدلا من التقليب ، مما يسمح بحقن الاعتمادية الذكية ، بما في ذلك اختبار الحقن.

هناك العديد من الأسباب المؤكدة ، هذه مجرد أمثلة قليلة.

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


يتم تصنيف فئة الملخص للكيانات ذات الصلة حيث يمكن استخدام الواجهات للكيانات غير ذات الصلة.

على سبيل المثال ، إذا كان لدي كيانان يقولان الحيوان والإنسان ، فسوف أذهب إلى الواجهة حيث أنني يجب أن أذهب بالتفصيل ويقول النمر والأسد وتريد أن تتصل بحيوان ثم ستختار الطبقة الحيوانية الملخص.

سوف تبدو مثل أدناه

   Interface             
   ____|____
  |        |
Animal   Human



  Animal (Abstract class)
   __|___
  |      |
Tiger   Lion

يمكنك فقط أن ترث من صف دراسي واحد. يمكنك أن ترث من واجهات متعددة. هذا يحدد ما أستخدمه لمعظم الحالات.

ميزة الطبقة المجردة هي أنه يمكن أن يكون لديك تطبيق أساسي. ومع ذلك ، في حالة IDisposable ، يكون التطبيق الافتراضي عديم الفائدة ، حيث لا تعرف الطبقة الأساسية كيفية تنظيف الأشياء بشكل صحيح. وبالتالي ، ستكون الواجهة أكثر ملاءمة.


واجهات هي عقود يجب أن يتبعها المنفذون. تسمح الفصول المستخلصة بالعقود بالإضافة إلى عمليات التنفيذ المشتركة - وهو أمر لا يمكن أن توفره الواجهات. يمكن للفئات تنفيذ وراثة واجهات متعددة. يمكن للفصول فقط توسيع فئة مجردة واحدة.

لماذا الواجهة

  • ليس لديك الافتراضي أو تطبيق التعليمات البرمجية المشتركة
  • تريد مشاركة عقود البيانات (خدمات الويب ، SOA)
  • لديك تطبيقات مختلفة لكل منفذ واجهة ( IDbCommand لديها SqlCommand و OracleCommand التي تقوم بتنفيذ الواجهة بطرق محددة )
  • تريد دعم عدة ميراث .

لماذا الملخص







oop