2012-01-11 21 views
6

仮想プロパティまたはメソッドは、オーバーライドするサブクラスで表示可能なメソッドです。しかし、例えば、NHibernateは遅延プロパティを保証するために仮想プロパティを使用します。仮想プロパティと遅延ロード

私の質問はNHibernateについてではありませんが、どうやってレイジーロードを達成するために仮想プロパティを使うことができますか?私が知らないバーチャルプロパティに関する隠された振る舞いはありますか?

答えて

9

これらが仮想として宣言されていることから、NHibernateはプロパティをオーバーライドしてプロキシの実装を作成することができます。プロキシは、プロパティの最初のアクセス時に遅延ロードを実装するために使用できます。

+0

Nhibernateはあなたのクラスを継承しますか? –

+0

はい、そのために 'virtual'が必要です。これにより、アクセス時にデータをフェッチするためのコードでプロパティを置き換えることができます。 – ChrisAnnODell

+0

@ChrisAnnODellランタイムで継承することでクラスを継承する方法を教えてください。 –

2

virtualのメンバーの何も目に触れていません。それほど隠されていないという事実を除いて、それらは子クラスでオーバーライドすることができます。

レイジーローディングは、Lazy<T>クラスを使用することによって達成できます。ここで、Tはロードされる型です。暗黙のうちにTに変換されます。

それとも、手動で怠惰な動作するようにプロパティを設定したい場合は、このような使用することができますそれらNullable<T>作るために

private SomeType _someProperty = null; 
public override SomeType SomeProperty 
{ 
    get 
    { 
     if (_someProperty == null) 
     { 
      // Load _someProperty 
     } 
     return _someProperty; 
    } 
} 

値型であなたが選ぶことができます。または、それらがロードされているかどうかにかかわらず、boolを導入してください。

+0

彼がLazy にアクセスできない場合はどうなりますか?そして、仮想/オーバーライドでどのように怠惰を達成することができますか?私はこれがOPが意味するものだと思う。 – oleksii

+0

マニュアル怠惰。それを指定しましょう。 – Aidiakapi