web-dev-qa-db-ja.com

C#の仮想/抽象フィールド

C#クラスにvirtual/abstractフィールドを持つことは可能ですか?もしそうなら、それはどのように行われますか?

31
user489041

仮想/抽象フィールドですか?いいえ。フィールドはデータを保持するためだけにあります。実装するものは何もありません。

ただし、 仮想/抽象プロパティの定義 は可能です。

51
Justin Niessner

MSDNドキュメントの最初の文はあなたの質問に答えます:

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

http://msdn.Microsoft.com/en-us/library/9fkccyh4(v = vs.80).aspx

9
qJake

いいえ、フィールドは割り当てられず、オーバーライドされます。

ただし、おそらくプロパティを使用でき、ほとんど同じように見えます

public class MyClass {
  public int MyField; //field
  public virtual int MyProperty { get; set; }  //property
}

両方とも次のように使用されます:

var x = new MyClass();
Debug.WriteLine("Field is {0}", x.MyField);
Debug.WriteLine("Property is {0}", x.MyProperty);

消費者がリフレクションを使用していない限り、まったく同じに見えます。

7
George Mauer

ただし、仮想または抽象プロパティを使用できます。

public abstract string ModelName { get; set; }
6
Blindy

いいえ。フィールドはvirtual\abstractにはできませんが、プロパティにはできます。

2
CD..

フィールドはクラス内の保管場所です-フィールドを「オーバーライド」したり、仮想化することはできません。

一方、プロパティは仮想または抽象の両方にすることができます。プロパティは、プロパティ値を取得または設定する作業を行うget/setメソッドを取り巻く構文上の砂糖です。

1
LBushkin

プロパティは仮想的である可能性がありますが、それを利用することもできます。少なくともNHibernateでは頻繁に使用されます。

基本的に、仮想化する方法が必要ですが、仮想フィールドはどのように機能する必要がありますか?

1
Yurii Hohan

いいえ。プロパティを使用して、何をするように見えるかを達成する必要があります。

1
Eric Farr

古い質問ですが、ここに私の2セントがあります:

仮想フィールドを作成できない場合もありますが、1つcan OPが探していると思われるものを実現します。これは、派生クラスのフィールドの値をベースの値と異なるものにすることです。

単にコンストラクタで「派生」値を割り当てます。

(ただし、int i = 1; int j = i;のようなフィールド初期化子があれば十分ではありません)。

1
ispiro