أسلوب استرجاع القيمة الغير متماثلة لإمكانية وصول ذوي الاحتياجات الخاصة ( ارشادات برمجة C#)

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

private string name = "Hello";

public string Name
{
    get
    {
        return name;
    }
    protected set
    {
        name = value;
    }
}

في هذا المثال، خاصية تدعى Name يحدد get وتعرف موصل التشغيل set. موصل التشغيلget يتلقى مستوى إمكانية وصول ذوي الاحتياجات الخاصة للخاصية نفسها، public في هذه الحالة، بينما يقوم موصل التشغيل set بالتقييد بصراحة بتطبيق معدّل الوصول محمي لموصل التشغيل نفسه.

القيود المفروضة على معدلات الوصول لموصلات التشغيل.

يتم استخدام معدّلات موصلات التشغيل على الخصائص أو المفهرسات خاضع للشروط التالية:

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

  • يمكنك استخدام معدّلاتموصلات التشغيل فقط إذا كان يحتوي على خاصية أو مفهرس كلاهما set و get موصل تشغيل. وفي هذه الحالة، يسمح المعدل لواحد فقط من موصلين اثنين.

  • إذا كان خاصية أو مفهرس معدّليمنعمعدّل, فإنه يجب أن تطابق موصل التشغيل معدّل موصل التشغيل الموصل متخطاة، أن وجدت.

  • مستوى إمكانية وصول ذوي الاحتياجات الخاصة في موصل التشغيل يجب أن يكون أكثر تقييداً من مستوى موصل التشغيل في الخاصية أو المفهرس نفسه.

معدّلات الوصول لموصلات التشغيل الممنوعة.

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

public class Parent
{
    public virtual int TestProperty
    {
        // Notice the accessor accessibility level.
        protected set { }

        // No access modifier is used here.
        get { return 0; }
    }
}
public class Kid : Parent
{
    public override int TestProperty
    {
        // Use the same accessibility level as in the overridden accessor.
        protected set { }

        // Cannot use access modifier here.
        get { return 0; }
    }
}

واجهات التطبيق

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

public interface ISomeInterface
{
    int TestProperty
    {
        // No access modifier allowed here
        // because this is an interface.
        get;
    }
}

public class TestClass : ISomeInterface
{
    public int TestProperty
    {
        // Cannot use access modifier here because
        // this is an interface implementation.
        get { return 10; }

        // Interface property does not have set accessor,
        // so access modifier is allowed.
        protected set { }
    }
}

مجال موصل التشغل لامكانية وصول ذوي الاحتياجات الخاصة.

إذا كنت تستخدم معدّل وصول تشغيل على موصل التشغيل, فإن مجال مجال إمكانية وصول ذوي الاحتياجات الخاصة لموصل التشغيل يتم تقريره بواسطة هذا المعدّل.

إذا لم تستخدم معدّل وصول على موصل التشغيل, فإن مجال إمكانية وصول ذوي الاحتياجات الخاصة لموصل التشغيل يتم تحديده بمستوى امكانية وصول ذوي الحاتياجات الخاصة للخاصية أو المفهرس.

مثال

يحتوي المثال التالي على ثلاثة فئات BaseClass, DerivedClass، و MainClass. هناك خاصيتين BaseClass, Name و Id على كل فئات. يوضح المثال كيف للخاصية IdعلىDerivedClass يمكن أن يكون مخفي بواسطة خاصية Id على BaseClass عند استخدام معدل وصول تقييداً مثل محميأو خاص. لذلك، عندما قمت بتعيين قيم لهذه الخاصية, فإنه يتمم استدعاء الخاصية على الفئة BaseClass بدلاً من ذلك. استبدال المعدّل الوصول بواسطة العام سيجعل خاصية يمكن الوصول إليها.

كما يوضح المثال الذي معدّل وصول تقييداً مثل private أو protected، على موصل التشغيل set للخاصية Name في DerivedClass يمنع الوصول لموصل التشغيل ثم يقوم بإنشاء خطأ عند التعيين إليه.

public class BaseClass
{
    private string name = "Name-BaseClass";
    private string id = "ID-BaseClass";

    public string Name
    {
        get { return name; }
        set { }
    }

    public string Id
    {
        get { return id; }
        set { }
    }
}

public class DerivedClass : BaseClass
{
    private string name = "Name-DerivedClass";
    private string id = "ID-DerivedClass";

    new public string Name
    {
        get
        {
            return name;
        }

        // Using "protected" would make the set accessor not accessible. 
        set
        {
            name = value;
        }
    }

    // Using private on the following property hides it in the Main Class.
    // Any assignment to the property will use Id in BaseClass.
    new private string Id
    {
        get
        {
            return id;
        }
        set
        {
            id = value;
        }
    }
}

class MainClass
{
    static void Main()
    {
        BaseClass b1 = new BaseClass();
        DerivedClass d1 = new DerivedClass();

        b1.Name = "Mary";
        d1.Name = "John";

        b1.Id = "Mary123";
        d1.Id = "John123";  // The BaseClass.Id property is called.

        System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);
        System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    Base: Name-BaseClass, ID-BaseClass
    Derived: John, ID-BaseClass
*/

التعليقات

ولاحظ أنه إذا استبدلت التعريف new private string Id بواسطة new public string Id، يمكنك الحصول على الإخراج:

Name and ID in the base class: Name-BaseClass, ID-BaseClass

Name and ID in the derived class: John, John123

راجع أيضًا:

المرجع

الخصائص (دليل البرمجة لـ #C)

المفهرسات ( ارشادات برمجة C# )

معدلات الاتصال ( ارشادات البرمجة C# )

المبادئ

دليل البرمجة لـ #C