C#泛型方法声明问题

时间:2018-01-19 18:30:38

标签: c# generics

假设我们想要构建一个由多个装配部件组成的装配线,每个装配部件将某些东西作为输入,处理它然后将其传递给下一个部件。

想象一下遵循这个约定的以下装配线:[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;
    }

}

..我有什么需要替换???来使这项工作? 由于我并不关心???是什么类型(我不需要知道),我想我可以使用Objectdynamic,但这并没有让我更进一步

2 个答案:

答案 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; }

但是现在你需要将它们传递给类的参数,这将迫使你更新你的属性上的参数,这将迫使你更新类的参数......

这将使自身更加复杂,直到你做出足够的决定。