أعضاء C # المحمية الذين تم الوصول إليهم عبر متغير الطبقة الأساسية [مكررة

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

سؤال

قد يبدو سؤالا مبتدئا بالأحرى، ولكن هل يمكنك شرح سبب عدم توفر طريقة Der.b () الوصول إلى Foo المحمي عبر متغير الفئة الأساسية؟ هذا يبدو غريبا بالنسبة لي:

public class Base
{
    protected int Foo;
}

public class Der : Base
{
    private void B(Base b) { Foo = b.Foo; } // Error: Cannot access protected member

    private void D(Der d) { Foo = d.Foo; } // OK
}

شكرا!

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

المحلول

هذا سؤال يسأل كثيرا. لمعرفة سبب هذا غير قانوني، فكر في ما يمكن أن يحدث خطأ.

لنفترض أنه كان لديك فئة أخرى مشتقة Froub المستمدة من القاعدة. الآن يمكنك تمرير مثيل frob to der.b. يجب أن تكون قادرا على الوصول إلى frob.foo من der.b؟ لا لا على الاطلاق. frob.foo محمي؛ يجب أن يكون فقط يمكن الوصول إليه من Frob و Subclasses Frob. دير ليس frob وليس فئة فرعية من frob، لذلك لا يمكن الوصول إلى أعضاء FROB المحمي.

إذا لم يكن هذا غير واضح، راجع مقالتي حول هذا الموضوع:

http://blogs.msdn.com/ericlippert/archive/2005/11/09/491031.aspx.

نصائح أخرى

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

يمكنك العمل حول هذا القيد بإعلان طريقة ثابتة في الفئة الأساسية:

public class Base
{
    protected int Foo;

    protected static int GetFoo(Base b)
    {
        return b.Foo;
    }
}

public class Der : Base
{
    private void B(Base b) { Foo = GetFoo(b); } // OK
}

ببساطة وضع، محمي يسمح الوصول إلى الفصول الفرعية.

في:

private void B(Base b) { Foo = b.Foo; }

أنت تحاول الوصول إلى عضو محمي مثيل der الخاص بك لا يملك الوصول إليه. سيكون من السوى الوصول إليها إذا كانت الفئة الأساسية لمثيل Der (هذا).

private void D(Der d) { Foo = d.Foo; } // OK

يعمل بشكل جيد لأنك تمر عبر Der للوصول إلى الأسلوب المحمي من الفصول الأساسية.

في السيناريو، تحاول أنك تريد استخدام "داخلي" للحصول على Int Foo.

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