インタフェースがフィールドを含めることはできませんが、彼らはプロパティを含めることができ、いくつかの方法でこれらの文を置きます。ほとんどの場合、プロパティは、フィールドのように使うことができ、そしてそこに言うと全く困難ではありません:タイプICombinedProperties
の保存場所を考えると
interface ISomeProperties
{int prop1 {get;set;}; string prop2 {get; set;}}
interface IMoreProperties
{string prop3 {get;set;}; double prop4 {get; set;}}
interface ICombinedProperties : ISomeProperties, IMoreProperties;
{ }
は、1が直接、大騒ぎせずにすべての4つのプロパティにアクセスすることができます。
ただし、プロパティでは実行できないフィールドで実行できることがいくつかあることに注意してください。たとえば、フィールドをInterlocked.Increment
に渡すことはできますが、プロパティはできません。変数にコピーしてInterlocked.Increment
を呼び出すことによってプロパティをInterlocked.Increment
にしようとしましたが、その結果をプロパティにコピーすることがある場合がありますが、2つのスレッドが同時に同じことをしようとすると失敗します。例えば2つのスレッドが最初に5に等しいフィールドにInterlocked.Increment
を呼び出すと、7を生成することが保証されるのに対して、両方のスレッドが5の値を読み込み、6にインクリメントしてから6に書き戻すことができます。
これを回避するには、フィールドにインターロックされたメソッドを実行するメソッドが必要です(フィールドにInterlocked.Increment
を呼び出して結果を返す関数など)。インタフェースのインスタンスを考えるとref
パラメータ(例えば
delegate void ActionByRef<T1>(ref T1 p1);
delegate void ActionByRef<T1,T2>(ref T1 p1, ref T2 p2);
delegate void ActionByRef<T1,T2,T3>(ref T1 p1, ref T2 p2, ref T3 p3);
interface IThing
{ // Must allow client code to work directly with a field of type T.
void ActOnThing(ActionByRef<T> proc);
void ActOnThing<ExtraT1>(ActionByRef<T, ExtraT1> proc, ref ExtraT1 ExtraP1);
void ActOnThing<ExtraT1, ExtraT2>
(ActionByRef<T> proc, ref ExtraT1 ExtraP1, ref ExtraT2 ExtraP2);
}
としてフィールドで指定したデリゲートを呼び出す関数を含む、1のような何かを行うことができます:
theInstance.ActOnThing(
(ref int param) => Threading.Interlocked.Increment(ref param)
);
かを、 1はローカル変数maskValue
とxorValue
を持っていたし、アトミックfield = (field & maskValue)^xorValue
でフィールドを更新したい場合:
theInstance.ActOnThing(
(ref int Param, ref int MaskValue, ref int XorValue) => {
int oldValue,newValue;
do {oldValue = param; newValue = (oldValue & MaskValue)^XorValue;
while (Threading.Interlocked.CompareExchange(ref Param, newValue, oldValue) !=
oldValue),
ref maskValue, ref xorValue);
);
1はフィールド上で実行したいアクションの唯一の少数の種類があった場合、それは単に含めることが最も簡単でしょうそれらをインタフェース内に置く。一方、上記のアプローチは、インターフェースがフィールドを公開し、クライアントが任意の一連のアクションを実行できるようにします。
コンポジションを使用できます。また、[ミックスイン](http://stackoverflow.com/questions/255553/is-it-possible-to-implement-mixins-in-c) –