ターゲット ブロック型と同じインターフェイスを実装する抽象型を作成できます ( TransformBlock
implementsIPropagatorBlock
およびIReceivableSourceBlock
)。
そのブロックの動作を複製する代わりに、すべてのメソッド呼び出しをinnerBlock
その型の に委譲します。
public abstract class AbstractMultiplyBlock<TInput, TOutput>
: IPropagatorBlock<TInput, TOutput>, IReceivableSourceBlock<TOutput>
{
private readonly TransformBlock<TInput, TOutput> innerBlock;
protected AbstractMultiplyBlock(TransformBlock<TInput, TOutput> innerBlock)
{
this.innerBlock = innerBlock;
}
// ... interface implementations omitted for brevity, see appendix
}
この抽象クラスには、クラスと同じプロパティとメソッドがすべて含まれていTransformBlock
ます。TransformBlock
ここで、 のインスタンスを基本コンストラクターに渡す派生型を作成します。
public sealed class MultiplyByTwoBlock : AbstractMultiplyBlock<int, int>
{
public MultiplyByTwoBlock()
: base(new TransformBlock<int, int>(x => x * 2))
{
}
}
public sealed class MultiplyByThreeBlock : AbstractMultiplyBlock<int, int>
{
public MultiplyByThreeBlock()
: base(new TransformBlock<int, int>(x => x * 3))
{
}
}
使用方法は、他のインスタンスと同じです。TransformBlock
var calculator1 = new MultiplyByTwoBlock();
var calculator2 = new MultiplyByThreeBlock();
calculator1.LinkTo(calculator2);
// x = 10 * 2 * 3
calculator1.Post(10);
var x = calculator2.Receive();
付録
の完全なソース コードAbstractMultiplyBlock
public abstract class AbstractMultiplyBlock<TInput, TOutput>
: IPropagatorBlock<TInput, TOutput>, IReceivableSourceBlock<TOutput>
{
private readonly TransformBlock<TInput, TOutput> innerBlock;
protected AbstractMultiplyBlock(TransformBlock<TInput, TOutput> innerBlock)
{
this.innerBlock = innerBlock;
}
public DataflowMessageStatus OfferMessage(DataflowMessageHeader messageHeader, TInput messageValue, ISourceBlock<TInput> source,
bool consumeToAccept)
{
return ((ITargetBlock<TInput>)innerBlock).OfferMessage(messageHeader, messageValue, source, consumeToAccept);
}
public void Complete()
{
innerBlock.Complete();
}
public void Fault(Exception exception)
{
((IDataflowBlock)innerBlock).Fault(exception);
}
public Task Completion
{
get { return innerBlock.Completion; }
}
public IDisposable LinkTo(ITargetBlock<TOutput> target, DataflowLinkOptions linkOptions)
{
return innerBlock.LinkTo(target, linkOptions);
}
public TOutput ConsumeMessage(DataflowMessageHeader messageHeader, ITargetBlock<TOutput> target, out bool messageConsumed)
{
return ((ISourceBlock<TOutput>)innerBlock).ConsumeMessage(messageHeader, target, out messageConsumed);
}
public bool ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock<TOutput> target)
{
return ((ISourceBlock<TOutput>)innerBlock).ReserveMessage(messageHeader, target);
}
public void ReleaseReservation(DataflowMessageHeader messageHeader, ITargetBlock<TOutput> target)
{
((ISourceBlock<TOutput>)innerBlock).ReleaseReservation(messageHeader, target);
}
public bool TryReceive(Predicate<TOutput> filter, out TOutput item)
{
return innerBlock.TryReceive(filter, out item);
}
public bool TryReceiveAll(out IList<TOutput> items)
{
return innerBlock.TryReceiveAll(out items);
}
}