سؤال

على وجه التحديد، هل يمكن لأي شخص أن يعطيني أمثلة محددة عن متى ومتى لا يجب استخدام الفئات المتداخلة؟

لقد عرفت عن هذه الميزة منذ الأبد، ولكن لم يكن لدي أي سبب لاستخدامها.

شكرًا.

هل كانت مفيدة؟

المحلول

عندما يتم استخدام الفئة المتداخلة فقط من قبل الفئة الخارجية، فإن المثال الرائع، الذي لم يعد ضروريًا، هو فئة العداد لمجموعة.

مثال آخر قد يكون للتعداد ليحل محل المعلمة الخاطئة الحقيقية المستخدمة بواسطة طريقة داخل فئة ما، لتوضيح توقيع الاستدعاء...

بدلاً من

public class Product
{
    public void AmountInInventory(int warehouseId, bool includeReturns)
    {
        int totalCount = CountOfNewItems();
        if (includeReturns)
            totalCount+= CountOfReturnedItems();
        return totalCount;
    }
}

و

  product P = new Product();
  int TotalInventory = P.AmountInInventory(123, true);  

مما يجعل من غير الواضح ما تعنيه كلمة "صحيح"، يمكنك أن تكتب:

public class Product
{
    [Flags]public enum Include{None=0, New=1, Returns=2, All=3 }
    public void AmountInInventory(int warehouseId, Include include)
    {
        int totalCount = 0;
        if ((include & Include.New) == Include.New)
            totalCount += CountOfNewItems();
        if ((include & Include.Returns) == Include.Returns)
            totalCount += CountOfReturns();
        return totalCount;
    }
}


  product P = new Product();
  int TotalInventory = P.AmountInInventory(123, Product.Include.All);  

مما يجعل قيمة المعلمة واضحة في كود العميل.

نصائح أخرى

المكانان اللذان أستخدم فيهما الفئات المتداخلة:

  • يتم استخدام الفئة المتداخلة حصريًا بواسطة الطبقة الخارجية، وأريد نطاقًا خاصًا تمامًا.

  • يتم استخدام الفئة المتداخلة خصيصًا لتنفيذ واجهة محددة في مكان آخر.على سبيل المثال، تنفيذ العداد يقع ضمن هذه الفئة.

أنت حقًا لا تريد استخدام الفئات المتداخلة إلا عندما تكون متأكدًا من أن الفئة المتداخلة ليس من المنطقي استخدامها في أي مكان آخر.

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

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

أستخدم هذا أحيانًا لفئات المساعدة البسيطة التي أحتاجها لوظيفة أو وظيفتين داخل الفصل الأصلي.

للحصول على مثال عملي، راجع هذا السؤال الذي تم طرحه في وقت سابق من هذا الصباح:
هل تريد جعل الكائن متاحًا لكائن واحد آخر فقط في نفس التجميع؟

ملخص:يمكنك تداخل فئة بيانات مرتبطة داخل كائن الأعمال الخاص بها.

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

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

باتباع "قواعد" العم بوب بشأن التماسك، يجب أن تجد أنك تقوم بالفعل بإنشاء عدد لا بأس به من الفئات المتداخلة (والمتداخلة والمتداخلة!).هؤلاء استطاع تكون غير متداخلة ولكن فقط إذا كان لديك عملاء آخرين يشيرون إليهم الآن.

أود تحسين إجابتي السابقة!

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

public class Worker
{
  private IHelper _helper;

  public Worker()
    : this (new DefaultHelper())
  {
  }
  public Worker(IHelper helper)
  {
    this._helper = helper;
  }

  private class DefaultHelper : IHelper
  {
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top