我想开发一个通用管道。这意味着我先调用一个元素,然后再调用下一个元素,依此类推。就它而言,它按预期的方式工作。 现在,我想开发一个Abstract类(如果Tinput / TOutput是一个列表)通过抽象方法ProcessOne处理元素。 我知道泛型必须与某些类型有关。 不幸的是,C#不喜欢它。我究竟做错了什么?也许还有更好的方法(随意提供不同的方法)。
public interface IPipeline<out TOutput>
{
TOutput Process();
}
public abstract class PipeItem<TInput, TOutput> : IPipeline<TOutput>
{
protected readonly IPipeline<TInput> nextPipeItem;
protected PipeItem(IPipeline<TInput> nextPipeItem)
{
this.nextPipeItem = nextPipeItem;
}
public abstract TOutput Process();
}
public abstract class CollectionPipe<TInput, TOutput> : PipeItem<TInput, TOutput>
where TInput : List<TInput>
where TOutput : List<TOutput>
{
protected CollectionPipe(IPipeline<TInput> nextPipeItem) : base(nextPipeItem)
{
}
public override TOutput Process()
{
return nextPipeItem.Process().Select(ProcessOne).ToList();
}
protected abstract TOutput ProcessOne(TInput input);
}
public class SomeImplementation : CollectionPipe<List<string> , List<char[]>> {
public SomeImplementation() : base(new SomeNextPipe())
{
}
protected override char[] ProcessOne(string input){
return input.ToCharArray();
}
}
答案 0 :(得分:0)
我不确定这是否是您想要的,但它至少应该为您提供一些指导。
您可以说TInput
实现了TOutput
集合中的CollectionPipe
,而不是说PipieItem
/ TInput
本身就是集合和TOutput
:
public abstract class CollectionPipe<TInput, TOutput> : PipeItem<List<TInput>, List<TOutput>>
{
protected CollectionPipe(IPipeline<List<TInput>> nextPipeItem) : base(nextPipeItem)
{
}
public override List<TOutput> Process()
{
return nextPipeItem.Process().Select(ProcessOne).ToList();
}
protected abstract TOutput ProcessOne(TInput input);
}
然后,实现可以只说出它们输入和输出的类型,就已经知道它们是集合(因为它们实现了CollectionPipe
而不是PipeItem
:
public class SomeImplementation : CollectionPipe<string, char[]>
{
public SomeImplementation() : base(/*something here*/)
{
}
protected override char[] ProcessOne(string input)
{
return input.ToCharArray();
}
}