0

次のようにプロパティに virtual キーワードを使用する人を見てきました。

public class Client
{
    public virtual int? Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Lastname { get; set; }
    public virtual int? Age { get; set; }
    public virtual ISet<Login> Logins { get; set; }
} 

何かを仮想として宣言するときにわかっているのは、派生クラスでそれをオーバーライドできるということだけですが、プロパティでこのキーワードを使用する別の理由があるのでしょうか?.

例を挙げて説明できれば、物事が明確になるかもしれません。

4

2 に答える 2

3

まさにこの理由で virtual キーワードを使用します。派生クラスが動作をオーバーライドできるようにするためです。プロパティには、オーバーライドできる動作もあります。この基本クラスが自動プロパティを使用しているからといって、すべての派生クラスが自動プロパティを使用する必要があるわけではありません。

public class IdCheckingClient : Client
{
    private int? backingfieldId;

    public override int? Id
    {
        get { return backingfieldId; }
        set 
        {
           if(value.HasValue && value.Value < 0)
           {
               throw new ArgumentException("ID needs to be positive or null");
           }
           backingfieldId = value;
        }  
    }
} 
于 2013-11-05T07:07:40.797 に答える
2

Patryk さんの言う通り、NHibernate や Entity Framework のような ORM とスムーズに連携できるようにするためです。次に、この ORM は、virtual として宣言されたこれらのプロパティの上にプロキシ クラスを構築し、それらの遅延読み込みを有効にします (すべてのナビゲーション データを取得します)。

例:

public class User
{
   public int ID { get; set; }
   public virtual Role Role { get; set; }
}
public class Role
{
   public int ID { get; set; }
   public string Name { get; set; }
   public virtual List<User> UsersInRole { get; set; }
} 

ユーザーを取得すると、関連するロールが自動的に取得されます。役割を取得すると、その役割のすべてのユーザーが自動的に取得されます。

Entity Framework のドキュメント: http://msdn.microsoft.com/en-us/data/jj679962

于 2013-11-05T07:23:40.390 に答える