gpt4 book ai didi

c# - 两种可能的编程模式,哪一种更合适?

转载 作者:行者123 更新时间:2023-11-30 22:06:05 28 4
gpt4 key购买 nike

我正在开发一个新的 .Net 库,它需要简化我们服务器的接口(interface)。我喜欢 LINQ,我目前的设计深受其影响。

目前我知道该任务有两种可能的编程模式,但我无法决定哪一种更简洁。在 C++ 中,我会使用模板特化,但我不能在 C# 中使用它。

我可以使用一个通用基接口(interface),然后指定派生接口(interface),这些接口(interface)添加一些特殊方法并覆盖(隐藏)一些派生方法:

interface ISelection<out T> {
ISelection<T> Skip(int n);
ISelection<T> Method2();
ISelection<T> Method3();
ISelection<T> Method4();

ISelection<TResult> Select<TResult>(Func<T, TResult> selector);
IDateTimeSelection Select(Func<T, DateTime> selector);

IResult<T> Submit();
}

interface IDateTimeSelection : ISelection<DateTime> {
new IDateTimeSelection Skip(int n);
new IDateTimeSelection Method2();
new IDateTimeSelection Method3();
new IDateTimeSelection Method4();

IDateTimeSelection SpecialMethod();
}

我也在考虑 curiously recurring template pattern 以避免覆盖(隐藏)派生方法。

interface IBaseSelection<out Selection, out T> where Selection : IBaseSelection<Selection, T> {
Selection Skip(int n);
Selection Method2();
Selection Method3();
Selection Method4();

ISelection<TResult> Select<TResult>(Func<T, TResult> selector);
IDateTimeSelection Select(Func<T, DateTime> selector);

IResult<T> Submit();
}

interface ISelection<out T> : IBaseSelection<ISelection<T>, T> {
}

interface IDateTimeSelection : IBaseSelection<IDateTimeSelection, DateTime> {
IDateTimeSelection SpecialMethod();
}

最后,我需要能够执行以下操作:

ISelection<Dataset> datasets = ...
var result = datasets
.Select(dataset => dataset.Date)
.Skip(5)
.SpecialMethod()
.Submit();

我希望你能告诉我应该使用哪种方法,甚至说服我使用更好的方法。

PS:我不能使用扩展方法作为模板特化的解决方法。

最佳答案

在过去的几周里,我经常使用“奇怪的重复模板模式”来启用方法链。

但是我碰巧注意到这有一个警告:您的每个特殊类都继承了不同的接口(interface)。尽管它们都是由相同的源代码定义的,但泛型类型参数的差异实际上会使它们成为不同的类型。例如,如果您想将不同类型的 ISelection-s 放入一个集合中,这可能会产生问题。

除非你做<T>一个<out T> .这又意味着你只能“输出”,即返回T - 类型的对象,但不将它们作为参数。

关于c# - 两种可能的编程模式,哪一种更合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23865508/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com