0

我有一个带有以下(为简洁起见)声明的基类:

public abstract class MyBaseClass
{    
  public int RecordId { get; private set; }
  public string ObjectName { get; set; }
  public abstract string Status { get; set; }

  public GetMyObject(int id)
  {
     MyObject myObject = context.GetObjectById(id);
     this.RecordId = myObject.RecordId;
     this.ObjectName = myObject.ObjectName;
     this.Status = myObject.Status
  }
}

以下类使用它:

public class MySpecificClass : MyBaseClass
{
   public override string Status
   {
      get
      {
         if(this.Status == "something")
           return "some status";
         else
           return "some other status";
      }
      set
      {
         this.Status = value;
      }
   }

   public GetMySpecificObject(int id) : base(id)
   {
   }
} 

现在,当我将我的特定对象绑定到我的模型(我的实现恰好是 MVC)时,如果我只访问 RecordID 和 ObjectName,则返回对象就好了,但是如果我的 get 或 set 访问器(覆盖)状态被击中。

我已经在 SO 上找到了类似的问题...

为什么 Property Set 会抛出 StackOverflow 异常?

...但是通过自动属性实现,我的代码看起来是正确的并且不会创建无限循环(但这似乎是这种情况)。关于如何正确覆盖该属性的任何想法?

谢谢!

4

3 回答 3

4

这是“设计”。

在 Status 的设置器中,您调用 this.Status = value。Status 是一个虚拟属性,因此它将直接绑定回 MySpecificClass.Status 的设置器。

如果要访问基本属性,请使用 base。反而

base.Status = value;
于 2009-08-24T18:54:49.163 回答
1

基类中的抽象属性声明只是声明:“派生类必须实现一个名为 Status 的属性,带有 getter 和 setter”。在您的派生类中,在您的 getter 中调用 this.Status 是非法的(导致堆栈溢出)。

要解决此问题,请在派生类中使用具有支持字段的属性:

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;
       }
   }

}
于 2009-08-24T19:32:24.423 回答
0

MySpecificClass 中的 setter 应该不是问题,但 getter 肯定是 - 在内部,对 MySpecificClass 的 Status 实例的调用将调用自身以查看要返回的值,这将调用自身来查看。 .. 好。你明白了。

我会使用受保护的类变量而不是自动属性。

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;
        }
    }
}
于 2009-08-24T19:07:49.513 回答