هل من الممكن إضافة ملحق إلى خاصية في .NET عن طريق تجاوزه؟

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

سؤال

هل من الممكن أن تفعل شيئا مثل هذا؟

class A
{
    public virtual string prop
    {
        get
        {
            return "A";
        }
    }
}
class B: A
{
    private string X;
    public override string prop
    {
        get
        {
            return X;
        }
        set
        {
            X = value;
        }
    }
}

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

المثال الحالي لا يترجم، ولكن ربما أفتقد شيئا هنا.

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

class A
{
    public virtual string get_prop()
    {
            return "A";
    }
}
class B: A
{
    private string X;
    public override string get_prop()
    {
        return X;
    }
    public virtual string set_prop()
    {
        X = value;
    }
}
هل كانت مفيدة؟

المحلول

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

نصائح أخرى

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

public virtual string get_prop();

لا توجد طريقة SET_PROP لتجاوزها، ولا يمكنك تجاوز طريقة غير موجودة.

يمكنك إخفاء تطبيق الفئة الأساسية باستخدام الكلمة الأساسية "الجديدة" في فئةك المشتقة. يجب أن تجميع ما يلي بنجاح:

class A
{
    public virtual string prop
    {
        get
        {
            return "A";
        }
    }
}
class B : A
{
    private string X;
    public new string prop
    {
        get
        {
            return X;
        }
        set
        {
            X = value;
        }
    }
}

تقديم حقل جديد صفعات فوضوي. وفي كلتا الحالتين التي تحتاج إلى توخي الحذر بعدم كسر تعدد الأشكال والميراث (ماذا لو كانت المحادثات في الفصل الأساسي إلى المجال الخاص؟).

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

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

class A
{
    public string prop
    {
        get;
        protected set;
    }
}
class B : A
{
    public new string prop
    {
        get { return base.prop; }
        set { base.prop = value; }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top