C#クラスにvirtual/abstractフィールドを持つことは可能ですか?もしそうなら、それはどのように行われますか?
仮想/抽象フィールドですか?いいえ。フィールドはデータを保持するためだけにあります。実装するものは何もありません。
ただし、 仮想/抽象プロパティの定義 は可能です。
MSDNドキュメントの最初の文はあなたの質問に答えます:
Virtualキーワードは、メソッド、プロパティ、インデクサー、またはイベント宣言を変更し、派生クラスでオーバーライドできるようにするために使用されます。
http://msdn.Microsoft.com/en-us/library/9fkccyh4(v = vs.80).aspx
いいえ、フィールドは割り当てられず、オーバーライドされます。
ただし、おそらくプロパティを使用でき、ほとんど同じように見えます
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);
消費者がリフレクションを使用していない限り、まったく同じに見えます。
ただし、仮想または抽象プロパティを使用できます。
public abstract string ModelName { get; set; }
いいえ。フィールドはvirtual\abstractにはできませんが、プロパティにはできます。
フィールドはクラス内の保管場所です-フィールドを「オーバーライド」したり、仮想化することはできません。
一方、プロパティは仮想または抽象の両方にすることができます。プロパティは、プロパティ値を取得または設定する作業を行うget/setメソッドを取り巻く構文上の砂糖です。
プロパティは仮想的である可能性がありますが、それを利用することもできます。少なくともNHibernateでは頻繁に使用されます。
基本的に、仮想化する方法が必要ですが、仮想フィールドはどのように機能する必要がありますか?
いいえ。プロパティを使用して、何をするように見えるかを達成する必要があります。
古い質問ですが、ここに私の2セントがあります:
仮想フィールドを作成できない場合もありますが、1つcan OPが探していると思われるものを実現します。これは、派生クラスのフィールドの値をベースの値と異なるものにすることです。
単にコンストラクタで「派生」値を割り当てます。
(ただし、int i = 1; int j = i;
のようなフィールド初期化子があれば十分ではありません)。