في C#، هل يمكنني إخفاء/تعديل الملحقات في الفئات الفرعية؟

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

سؤال

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

class Properties
{
  public string Name { get; set; }
}

class MyClass
{
    class SubProperties: Properties
    {
        public override Name
        {
            get { return GetActualName(); }
            set { SetActualName(value); }
        }
    }

    public SubProperties ClassProperties;

    private string GetActualName()
    {
        return SomeFunction();
    }

    private void SetActualName(string s)
    {
        ClassProperties.Name = SomeOtherFunction(s);
    }
}

الفكرة هي أن يكون لديك أي كائن MyClass لديك خاصية يمكن الوصول إليها بالكامل ClassProperties. إلى هذا الكائن ، سيبدو تمامًا مثل كائن الخصائص ، ولكن وراء الكواليس ، تقوم MyClass في الواقع بحساب وتعديل نتائج الحقول. من الواضح أن طريقة الإعلان هذه خاطئة لأنني لا أستطيع الوصول GetActualName() و SetActualName() من داخل SubProperties تعريف. كيف يمكنني تحقيق شيء كهذا؟

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

المحلول

هل تبحث عن شيء مثل هذا؟

abstract class Properties
{
    public abstract string Name { get; set; }
}

class MyClass
{
    private class SubProperties : Properties
    {
        private MyClass myClass;

        public SubProperties(MyClass myClass)
        {
            this.myClass = myClass;
        }

        public override Name
        {
            get { return this.myClass.GetActualName(); }
            set { this.myClass.SetActualName(value); }
        }
    }

    private string name;

    public MyClass
    {
        this.MyClassProperties = new SubProperties(this);
    }

    public Properties MyClassProperties { get; private set; }

    private string GetActualName()
    {
        return this.name;
    }

    private void SetActualName(string s)
    {
        this.name = s;
    }
}

تحتاج إلى تمرير مرجع إلى مثيل MyClass إلى مثيل Subproperties إذا كنت ترغب في الوصول إلى طرق MyClass من Subproperties.

نصائح أخرى

public virtual string Name { get; set; }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top