web-dev-qa-db-ja.com

C#-public int virtualを使用する場合、およびpublic intのみを使用する場合

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

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

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

Web上の他の場所では、仮想という用語がどのような種類の一貫性でも使用されることはありません。

誰かが私に説明できますか:

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

事前に感謝します

22
Gravy

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

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

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

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

これらの概念をよく理解すると、本から作成するメソッドをvirtualにする必要があるかどうかを判断できる場合があります。

12
Andrew Hare

誰かが私に説明できますか:

  1. この特定のコンテキストにおける「仮想」という用語の目的

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

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

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

  3. なぜ一部の人は「仮想」を使用し、他の人は使用しないのですか?

    彼らはそれが必要なとき、または彼らがそれを必要とするかもしれないと思ったときにそれを使います。

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

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

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

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

7
danludwig

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

「仮想」キーワードは、「非表示」にするのではなく、誰かがメソッドまたはプロパティをオーバーライドしたい場合に必要です。

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

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

仮想キーワード

オーバーライドと新しいキーワードを使用したバージョン管理(C#プログラミングガイド)

4
iMortalitySX

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

MSDNから:

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

4
Mark Oreta

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

1
Joshua Honig

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

0

ドキュメントから

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

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

こちらをご覧ください http://msdn.Microsoft.com/en-us/library/9fkccyh4(v = vs.80).aspx

0
Anton Baksheiev