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 アクセサーが my (オーバーライド) ステータスはヒットです。

私はすでにSOで同様の質問を見つけました...

プロパティ セットが StackOverflow 例外をスローするのはなぜですか?

...しかし、自動プロパティの実装を見ると、私のコードは正しく、無限ループを作成しないように見えます (しかし、これは事実のようです)。そのプロパティを正しくオーバーライドする方法についてのアイデアはありますか?

ありがとう!

4

3 に答える 3

4

これが「バイデザイン」です。

Status のセッターでは、this.Status = value を呼び出しています。Status は仮想プロパティであるため、MySpecificClass.Status のセッターにバインドされます。

base プロパティにアクセスする場合は、base を使用します。代わりは

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

基本クラスの抽象プロパティ宣言は、「派生クラスは、getter と setter を使用して、Status というプロパティを実装する必要があります」と述べているだけです。派生クラスでは、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のセッターは問題になりませんが、ゲッターは間違いなく問題です。内部的には、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 に答える