22

J Gallowayによるチュートリアル「Professional ASP.NET MVC 3」に取り組んでいます。このチュートリアルでは、Jon が MVC ミュージック ストアを構築する方法を示します。

私は、最初に EF コードを使用してデータをモデル化する CS クラスを作成している部分にいます。

私は本のすべての例は、public virtual int property {get; set; }説明なしで使用されます。仮想という用語はどこにでも詰め込まれています。

Web の他の場所では、仮想という用語が一貫して使用されているのを見たことがありません。

誰でも私に説明してもらえますか:

  1. この特定の文脈における「仮想」という用語の目的
  2. 「仮想」の使用は必要ですか?
  3. 「仮想」を使用する人と使用しない人がいるのはなぜですか?
  4. 外部キーを定義するときに「仮想」のみを使用する人がいるのはなぜですか?
  5. 「仮想」という用語のベストプラクティスは何ですか?

よろしくお願いします

4

7 に答える 7

12

キーワードを本当に理解するために、あなたは一般的にポリモーフィズムvirtualについて読みたいと思うでしょう:

ポリモーフィズムは、カプセル化と継承に続く、オブジェクト指向プログラミングの3番目の柱と呼ばれることがよくあります。ポリモーフィズムはギリシャ語で「多くの形」を意味し、2つの異なる側面があります。

  1. 実行時に、派生クラスのオブジェクトは、メソッドパラメータやコレクションまたは配列などの場所で基本クラスのオブジェクトとして扱われる場合があります。これが発生すると、オブジェクトの宣言された型は、実行時型と同一ではなくなります。

  2. 基本クラスは仮想メソッドを定義および実装でき、派生クラスはそれらをオーバーライドできます。つまり、基本クラスは独自の定義と実装を提供します。実行時に、クライアントコードがメソッドを呼び出すと、CLRはオブジェクトの実行時型を検索し、仮想メソッドのオーバーライドを呼び出します。したがって、ソースコードでは、基本クラスのメソッドを呼び出して、派生クラスのバージョンのメソッドを実行させることができます。

これらの概念をよりよく理解すると、本から作成しているメソッドが必要かどうかを判断できる可能性がありますvirtual

于 2012-10-01T18:27:18.650 に答える
7

誰でも私に説明してもらえますか:

  1. この特定の文脈における「仮想」という用語の目的

    ここの他のユーザーは、非常に良い参考文献でこれによく答えました。

  2. 「仮想」の使用は必要ですか?

    場合によります。必要な場合もあれば、不要な場合もあります。

  3. 「仮想」を使用する人と使用しない人がいるのはなぜですか?

    必要なとき、または必要になると思われるときに使用します。

  4. 外部キーを定義するときに「仮想」のみを使用する人がいるのはなぜですか?

    Entity Framework や NHibernate などのオブジェクト リレーショナル マッピング ツールで使用する外部キーを定義する場合virtual、これらの ORM ツールはクラスから継承する新しいクラスを動的に作成するため、しばしば必要になります。これらの「動的プロキシ」クラスはvirtualプロパティをオーバーライドして、外部キーの一貫性を維持するために必要な追加の動作を提供します。NHibernate の場合、すべてのプロパティ (外部キーだけでなく) をマークする必要がありますvirtual。これは、NH 動的プロキシがカスタム動作を追加して、モデルのどのプロパティをデータベースから取得し、どのプロパティを読み込みを回避するかを決定するためです。

  5. 「仮想」という用語のベストプラクティスは何ですか?

    より派生したクラスでメンバー (メソッドまたはプロパティ) をオーバーライドする場合に使用します。マークの付いたクラスでは使用しないでくださいsealed

于 2012-10-01T22:12:56.540 に答える
4

仮想という用語は、基本的には「オーバーライド可能」(基本実装がある) を意味しますが、抽象的ではありません (元の実装がないことを意味します)。

メソッドやプロパティを「隠す」のではなくオーバーライドしてもらいたい場合は、「virutal」キーワードが必要です。

したがって、これはすべて継承とポリモーフィズムに当てはまります。派生クラスは、仮想メソッドをオーバーライドして独自の実装を作成できます (または、そのメソッドで基本実装を呼び出すこともできます)。オーバーライドすることで、基本実装ではなく、新しいメソッドがポリモーフィックに呼び出されることを保証できます。

逆に、「new」キーワードを使用すると、データ メンバーとメソッドを「非表示」にすることができます。これにより、独自の実装も可能になりますが、新しい実装をポリモーフィックに実行することはなく、基本クラスの実装が使用されます。

仮想キーワード

Override および New キーワードによるバージョン管理 (C# プログラミング ガイド)

于 2012-10-01T18:33:32.230 に答える
4

モデルで virtual キーワードを使用する理由は、Change Tracking プロキシを有効にするためです。これはEntity Frameworkに固有のものであり(編集:NHibernateも、おそらく他のormも@danludwigに感謝します)、データベースにマッピングしているエンティティをEFが自動的に管理できるようにします。

MSDN から:

データ モデル内のエンティティ型のプロパティにマップされる各プロパティには、非シール (Visual Basic では NotOverridable)、パブリック、および仮想 (Visual Basic ではオーバーライド可能) の get および set アクセサーが必要です。

于 2012-10-01T19:29:09.613 に答える
1

仮想(C#リファレンス)を参照してください 。キーワードを追加するvirtualと、派生クラスでプロパティをオーバーライドできます。これは、MVCアプリの一般化された基本クラスを構築している場合によく発生します。

于 2012-10-01T18:29:07.600 に答える
0

ドキュメントから

virtualキーワードは、メソッド、プロパティ、インデクサー、またはイベント宣言を変更し、派生クラスでオーバーライドできるようにするために使用されます。

したがって、古い機能を非表示にして新しい機能を追加する必要がある場合は、仮想を使用できます。新しいモジュールとアーキテクチャの開発に応じて、アプリケーションごとに異なる要件が必要です。

ここを参照してくださいhttp://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

于 2012-10-01T18:27:56.497 に答える
0

Virtual は、継承された子クラスがプロパティをオーバーライドするよう強制することで、基本クラスをオーバーライドすることを保証します。virtual キーワードがないと、子オブジェクトは基本機能をオーバーライドできません。

于 2012-10-01T18:37:06.597 に答える