سؤال

لدي فئة قاعدة "الوالد" مثل هذا:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Parent
    {
        private int parentVirtualInt = -1;
        public virtual int VirtualProperty
        {
            get
            {
                return parentVirtualInt;
            }
            set
            {
                if(parentVirtualInt != value)
                {
                    parentVirtualInt = value;
                }
            }
        }
    }
}

وفئة طفل مثل هذا:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Child : Parent
    {
        public override int VirtualProperty
        {
            get
            {
                if(base.VirtualProperty > 0)
                {
                    throw new ApplicationException("Dummy Ex");
                }
                return base.VirtualProperty;
            }
            set
            {
                if(base.VirtualProperty != value)
                {
                    base.VirtualProperty = value;
                }
            }
        }
    }
}

لاحظ أن Getter in Child يتصل بـ Getter of Parent (أو على الأقل هذا هو ما أنوي).

أستخدم الآن فئة "الطفل" عن طريق إنشاء إنشاء قيمة (دعنا نقول 4) إلى VirtualProperty ثم قراءة العقار مرة أخرى.

Child c = new Child();
c.VirtualProperty = 4;
Console.Out.WriteLine("Child.VirtualProperty: " + c.VirtualProperty);

عندما أقوم بتشغيل هذا ، من الواضح أنني أحصل على Applicationexception يقول "Dummy Ex". ولكن إذا قمت بتعيين نقطة توقف على الخط

if(base.VirtualProperty > 0)

في الطفل وتحقق من قيمة base.VirtualProperty (عن طريق تحوم الماوس فوقه) قبل أن يتم طرح الاستثناء (أفترض (د)) ، أحصل بالفعل على الاستثناء. من هذا أنقل إلى أن البيان base.VirtualProperty في "يدعو الطفل نفسه" ؛ نوعا من.

ما أود تحقيقه هو نفس السلوك الذي أحصل عليه عندما أقوم بتغيير تعريف parentVirutalInt (في الوالد) للمحمية والاستخدام base.parentVirtualInt في Getter of Child بدلاً من base.VirtualProperty. وأنا لا أرى بعد لماذا هذا لا يعمل. هل يستطيع اي شخص تسليط بعض الضوء على هذا الأمر؟ أشعر أن الخصائص المتجددة تتصرف بشكل مختلف عن الأساليب المتجاوز؟

بالمناسبة: أقوم بشيء مشابه جدًا مع التصنيف الفرعي لفصل ليس لدي أي سيطرة على (هذا هو السبب الرئيسي وراء عدم وجود "حل الخاص بي").

أطيب التحيات

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

المحلول

إنه (يمكن القول) خطأ في تصحيح الأخطاء. يمكنك إضافة تصويتك إلى هذا مقالة ردود الفعل. هذا ليس من السهل إصلاحه ، أنا متأكد من أن Debugger لا يتمتع بالوصول الجاهز إلى عنوان طريقة Getter Property نظرًا لأن فتحة T-Table لـ Property Getter تم استبدالها في الفئة المشتقة.

أحد الحلول المحتملة هو تخزين القيمة الأساسية في متغير محلي أولاً حتى تتمكن من فحص ذلك. هذا لن يجعل getter الخاص بك أبطأ.

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