Stack overflow exception thrown from overridden property from abstract base class

后端 未结 3 1846
深忆病人
深忆病人 2021-01-28 14:09

I have a base class with the following (trimmed for brevity) declaration:

public abstract class MyBaseClass
{    
  public int RecordId { get; private set; }
  p         


        
相关标签:
3条回答
  • 2021-01-28 14:27

    The setter in MySpecificClass shouldn't be a problem, but the getter definitely is - internally, a call to an instance of MySpecificClass's Status will be making a call to itself to see which value to return which will make a call to itself to see... well. You get the idea.

    I'd use a protected class variable rather than an auto-property.

    public abstract class MyBaseClass
    {
        protected string _status;
        public virtual string Status
        {
            get { return _status; }
            set { _status = value; } 
        }
    }
    
    public class MySpecificClass : MyBaseClass
    {
        public override string Status
        {
            get
            {
                if(_status == "something")
                    return "some status";
                else
                    return "some other status";
            }
            set
            {
                _status = value;
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-28 14:43

    The abstract property declaration in the base class just states: "derived classes MUST implement a property called Status, with a getter and setter". In your derived class, calling this.Status inside your getter is illegal (causes the stack overflow).

    To fix this, use a property with a backing field in your derived class:

    public abstract class MyBaseClass
    {
        public abstract string Status { get; set; }
    }
    
    
    public class MySpecificClass : MyBaseClass
    {
       private string _status;
       public override string Status
       {
           get
           {
              if(this._status == "something")
                return "some status";
              else
                return "some other status";
           }
           set
           {
               _status = value;
           }
       }
    
    }
    
    0 讨论(0)
  • 2021-01-28 14:48

    This is "By Design".

    In the setter of Status you are calling this.Status = value. Status is a virtual property and hence it will bind right back to the setter of MySpecificClass.Status.

    If you want to access the base property use base. instead

    base.Status = value;
    
    0 讨论(0)
提交回复
热议问题