سؤال

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

internal interface IFirstInterface
{
    ...
}

internal interface ISecondInterface
{
    IFirstInterface First{ get; }
    ...
}

public class Implementer : ISecondInterface
{
    public IFirstInterface First {get; private set;}
    ...
}

أسئلتي:

  1. لماذا الأعضاء الداخلية واجهات يجب أن يكون علنا تنفيذها ؟ إذا قمت بتطبيق واجهة على الطبقة الداخلية, لا ينبغي تنفيذها الأعضاء الداخلية ؟ هذه ليست قضية كبيرة منذ واجهة أعضاء لن تكون متاحة على أي حال ، نظرا الطبقة الداخلية.يبدو بديهية.

  2. المشكلة الرئيسية هي مع السيناريو أعلاه منذ أنا لا يمكن أن يكون العام حاصل على IFirstInterface لأنه هو الظاهر داخلي واجهة أيأحصل على الخطأ التالي من المترجم:

تتعارض الوصول:الملكية نوع 'IFirstInterface' هو أقل يمكن الوصول إليها من المنشأة 'المنفذ.الأولى'

هل هناك أي طريقة للتغلب على هذا ؟

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

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

المحلول

فقط ملاحظة - رمز في الواقع كنت قد قدمت لا تجميع ، لأن Implementer هو الطبقة الداخلية.المشكلة تأتي عندما Implementer هو الجمهور.

الطريقة هذه الجولة هو استخدام صريحة واجهة التنفيذ:

public class Implementer : ISecondInferface
{
    private IFirstInterface first;
    IFirstInterface ISecondInterface.First { get { return first; } }
}

لا يمكن أن يكون واضع هناك لأنك صراحة تنفيذ واجهة التي لا تحدد واضع.لك يمكن أن هل هذا كبديل:

public class Implementer : ISecondInterface
{
    internal IFirstInterface First { get; private set; }
    IFirstInterface ISecondInterface.First { get { return First; } }
}

من المؤسف أن الداخلية واجهات عامة الأعضاء - لا تعقد مثل هذه الأمور.سيكون من الغريب العامة واجهة داخلية الأعضاء (ماذا سيكون الداخلية إلى المنفذ أو المعلن?) ولكن الداخلية واجهات يجعل الكثير من معانيها.

نصائح أخرى

لماذا الأعضاء الداخلية واجهات يجب أن يكون علنا تنفيذها ؟

عند تعريف واجهة, كنت لا تحديد مستوى الوصول للأعضاء ، لأن كل واجهة الأعضاء public.حتى لو واجهة هذا النحو internal, أعضاء لا تزال تعتبر public.عند إجراء ضمني تنفيذ هذه الأعضاء التوقيع يجب أن المباراة, لذلك يجب أن تكون public.

فيما يتعلق تعريض جالبة, أود أن أقترح إجراء صراحة تنفيذ واجهة بدلا من ذلك ، وخلق internal الملكية لفضح القيمة:

internal IFirstInterface First { get; private set; }

IFirstInterface ISecondInterface.First
{
    get { return this.First; }
}

أنا أعرف هذا بعد بضع سنوات من العمر ولكن أعتقد أنه من الجدير بالذكر أن يمكنك تنفيذ داخلي واجهة على الطبقة العامة ، انظر الروابط التالية:

http://forums.create.msdn.com/forums/p/29808/167820.aspx
http://msdn.microsoft.com/en-us/library/aa664591%28VS.71%29.aspx

مثال من الرابط الأول:


internal interface ISecretInterface
{
    string Property1 { get; }
}

public class PublicClass : ISecretInterface
{
    // class property
    public string Property1
    {
        get { return "Foo"; }
    }

    // interface property
    string ISecretInterface.Property1
    {
        get { return "Secret"; }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top