假设我们想要构建一个由多个装配部件组成的装配线,每个装配部件将某些东西作为输入,处理它然后将其传递给下一个部件。
想象一下遵循这个约定的以下装配线:[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
,但这并没有让我更进一步
答案 0 :(得分:3)
在你的设计中,你需要你的类型不仅要知道它需要什么,它需要什么,还要知道它需要什么作为输入,以及它发送的是什么结果是它的输出,然后你需要知道是什么提供了输入到你所接受的东西的东西,以及你提供输出的东西输出的东西,等等,永远,在两个方向。
所以改变你的课程不需要知道。您的类型不需要提供输入的AssemblyPart
和输出的AssemblyPart
。你需要有一些只是提供一个值的东西,以及只接受一个值的东西。 AssemblyPart
然后可以接受某种类型的值,并提供其他类型的值,并且它可以使用任何,它可以为其输入提供值,无论它是否为“装配零件或其他东西,它可以将其输出提供给任何可以接受值的东西,而不仅仅是其他装配零件。这不仅意味着每个装配部件都不需要知道输入如何获得输入,以及输出如何使用它,但这意味着您可以在链中具有其他类型的东西,例如产生的东西没有输入的值(即启动链的东西)和使用值但不提供其他值的东西(即可以结束链的东西)。
答案 1 :(得分:-1)
您需要在班级中为上一个和下一个类型添加类型。到目前为止你编写代码的方式,每个AssemblyPart
必须知道它之前和之后的数据类型,所以你需要传递它。
abstract class AssemblyPart<Tin, TOut, TPrev, TNext>
但实际上,在课堂上使用AssemblyPart
时,您会遇到严重问题。你不能
AssemblyPart<TOut, TNext> Next { get; private set; }
AssemblyPart<TPrev, TIn> Previous { get; private set; }
每个人都需要 4 泛型参数。在设置它们时,您需要知道每个的前一个和下一个。它更像是:
AssemblyPart<TOut, TNext, TIn, TNextNext> Next { get; private set; }
AssemblyPart<TPrev, TIn, TPrevPrev, TOut> Previous { get; private set; }
但是现在你需要将它们传递给类的参数,这将迫使你更新你的属性上的参数,这将迫使你更新类的参数......
这将使自身更加复杂,直到你做出足够的决定。