سؤال

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

وقارن تطبيقات التاليين من هذا السيناريو.

وتنفيذ 1:

class Application 
{
   Application(ApplicationSettings settings) 
   {
       //Do initialisation here
   }
}

class ApplicationSettings 
{
   //Settings related methods and properties here
}

وتنفيذ 2:

class Application 
{
   Application(Application.Settings settings) 
   {
       //Do initialisation here
   }

   class Settings 
   {
      //Settings related methods and properties here
   }
}

للي، والنهج الثاني هو الأفضل للغاية من ذلك بكثير. ومن أكثر قابلية للقراءة لأنه يؤكد بقوة العلاقة بين الطبقتين. عندما أكتب الرمز إلى مثيل فئة التطبيق في أي مكان، والنهج الثاني هو الذهاب الى نظرة أجمل.

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

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

وسؤالي هو، لماذا نحن نكون حذرين من استخدام "يتعرض علنا" الطبقات المتداخلة؟ هل هناك أي حجج أخرى ضد هذا الاستخدام؟

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

المحلول

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

public class Outer
{
    private Outer(Builder builder)
    {
        // Copy stuff
    }

    public class Builder
    {
        public Outer Build()
        {
            return new Outer(this);
        }
    }
}

وهذا يضمن أن <م> فقط سيلة لبناء مثيل الطبقة الخارجية هي عن طريق البناء.

ويمكنني استخدام نمط بكثير جدا من هذا القبيل في بلدي C # ميناء بروتوكول المخازن.

نصائح أخرى

ويمكنك استخدام النطاقات لربط الأشياء التي ... ذات الصلة.

وعلى سبيل المثال:

namespace Diner
{
    public class Sandwich
    {
        public Sandwich(Filling filling) { }
    }

    public class Filling { }
}

وميزة هذا على استخدام الطبقات كما لو كانت بمساحات هو أنه يمكنك اختياريا استخدام using على الجانب الدعوة لاختصار الأمور:

using Diner;

...

var sandwich = new Sandwich(new Filling());

إذا كنت تستخدم فئة Sandwich كما لو كانت مساحة اسم لFilling، لديك لاستخدام اسم Sandwich.Filling كامل للإشارة إلى Filling.

وكيف أنت ذاهب إلى النوم ليلا مع العلم أن؟

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

ومثال عملي آخر أن لدي لاستخدام صالح الطبقات المتداخلة العامة في نمط MVC عندما استخدم viewmodel مع خاصية IEnumerable. على سبيل المثال:

public class OrderViewModel
{
public int OrderId{ get; set; }
public IEnumerable<Product> Products{ get; set; }

public class Product {
public string ProductName{ get; set; }
public decimal ProductPrice{ get; set; }
}

}

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

وأنا في المقام الأول استخدام الطبقات المتداخلة للوصول إلى صقل إلى متداخلة و / أو الطبقة الحاوية.

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

ويمكنك أيضا استخدام هذا للتحكم استخدام فئة معينة.

مثال:

public abstract class Outer
{
  protected class Inner
  {
  }
}

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

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