假设我们要构建一条由多个装配零件组成的装配线,每个装配零件都将某些东西作为输入,对其进行处理,然后将其传递到下一个零件。
想象一下遵循此约定的以下组装线:[In-Type|Out-Type]
[String|DateTime]-[DateTime|Int32]-[Int32|Double]-[Double|String]
这样的装配零件类的外观如何?
abstract class AssemblyPart<Tin, TOut> {
AssemblyPart<TOut, ???> Next { get; private set; }
AssemblyPart<???, TIn> Previous { get; private set; }
abstract TOut OnProcess(TIn obj);
public TOut Process(TIn obj) {
TOut processedObj = OnProcess(obj);
Next?.Process(processedObj);
}
public void Connect(AssemblyPart<???, TIn> part){
Next = part;
part.Previous = this;
}
public void ConnectTo(AssemblyPart<TOut, ???> part){
Previous = part;
part.Next = this;
}
}
..用什么我必须替换
???
才能使它工作?因为我不太在意
???
是什么类型(我不需要知道),所以我认为可以使用Object
或dynamic
,但这并没有使我更进一步 最佳答案
在您的设计中,您需要您的类型不仅要知道它要接收什么,它要取出什么,还要知道它要吸收的东西是什么输入,以及它将结果发送给它的东西如何与其输入有关。输出,然后您需要知道什么为事物提供输入,什么东西为您所接受的事物提供输入,事物为您提供输出的事物为输出,以此类推,直到永远。
因此,更改您的班级不必知道这一点。您的类型不必具有提供输入的AssemblyPart
和接受输出的AssemblyPart
。您需要具有仅提供价值的东西,以及仅具有价值的东西。然后AssemblyPart
可以接受某种类型的值,并提供其他某种类型的值,并且它可以使用任何可以为其输入提供值的东西,无论是装配零件还是其他东西,并且可以将其输出提供给任何可以接受值的东西,而不仅仅是其他装配零件。这不仅意味着每个装配零件都不需要知道输入如何获取其输入以及其输出如何使用它,还意味着您可以在链中拥有其他类型的事物,例如可以通过没有输入(即启动链的事物)和使用值但不提供其他值的事物(即可以终止链的事物)。