كيفية الحد من الفئة الفئة الفرعية للفئة الأمريكية للإعلام إلى الأنواع في نفس التجميع، وبالتالي السماح للأعضاء المحمي المكتومة بالأنواع الداخلية

StackOverflow https://stackoverflow.com/questions/1729251

سؤال

هذا السؤال يشبه C # فئة مجردة داخلية، وكيفية إخفاء الاستخدام خارج لكن دوافعي مختلفة. هنا هو السيناريو

بدأت مع ما يلي:

internal class InternalTypeA {...}

public class PublicClass
{
   private readonly InternalTypeA _fieldA;

   ...
}

كل ما سبق يجمع بشكل جيد. ولكن بعد ذلك قررت أنه يجب علي استخراج فئة أساسية وحاولت كتابة ما يلي:

public abstract class PublicBaseClass
{
   protected readonly InternalTypeA _fieldA;

   ...
}

وبالتالي فإن المشكلة، العضو المحمي مرئيا خارج الجمعية ولكنه من نوع داخلي، لذلك لن يترجم.

المشكلة في متناول اليد هي كيف يمكنني (أو هل يمكنني؟) أخبر التحويل البرمجي أن الطبقات العامة فقط في نفس الجمعية التي قد يرثها علارية publicseclass من ذلك، وبالتالي لن يتم إلقاء فرض _fielda خارج الجمعية؟

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

الفكرة الوحيدة التي كان لدي حتى الآن هي ما يلي:

public abstract class PublicBaseClass
{
   private readonly InternalTypeA _fieldA;

   protected object FieldA { get { return _fieldA; } }

   ...
}

public class SubClass1 : PublicBaseClass
{
    private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } } 
}

public class SubClass2 : PublicBaseClass
{
    private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } } 
}

ولكن هذا قبيح!

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

المحلول

يوفر CLR إمكانية إمكانية الوصول عائليا والتي ستفعل ما تريد، ولكن لا يوجد بناء جملة في C # لاستخدامه.

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

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

نصائح أخرى

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

مثال:

public abstract class MyClass
{
    public static MyClass New()
    { return new InternalMyClass(); }
}

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