我正在构建一个流利的接口(interface),其中有一个包含大量流利逻辑的基类,以及一个添加了一些特殊行为的派生类。我面临的问题是从派生类型的实例调用时,基类中fluent方法的返回类型。调用基类的方法后,仅基类的方法可用于进一步流畅的调用。
更改方法的调用顺序将有助于其编译,但使其可读性降低,这对于流利的接口(interface)来说很重要。有没有一种方法可以为基类定义某种“此”类型,以便所有方法都返回相同的类型。
例子
public class Field<T>
{
public Field<T> Name( string name )
{
_name = name;
return this;
}
}
public SpecialField<T> : Field<T>
{
public SpecialField<T> Special(){ return this; }
}
// !!! Arrgh. Special is not a member of the Field<T> class.
var specialField = new SpecialField()
.Name( "bing" )
.Special();
破损的解决方案我已经尝试通过执行以下操作来解决它,但是它不是有效的C#:(但至少表示我想如何编写接口(interface)代码。
public class Field<T,TThis> : TThis
where TThis : Field<T,TThis>
{
public TThis Name( string name ){...}
}
public SpecialField<T> : Field<T,SpecialField<T>>
{
public TThis Special(){ return this; }
}
最佳答案
在探究其他一些流利的API之后,我发现了如何做到这一点。它不是很干净,但是效果很好。基本上,您为要使用的每个派生类型引入一个中间基类,并将“TThis”类型传递给实际实现。
样本
public class FieldBase<T,TThis>
where TThis : FieldBase<T,TThis>
{
private string _name;
public TThis Name( string name )
{
_name = name;
return (TThis)this;
}
}
public class Field<T> : FieldBase<T,Field<T>>{}
public class SpecialFieldBase<T,TThis> : FieldBase<T,TThis>
where TThis : SpecialFieldBase<T,TThis>
{
public TThis Special(){ return (TThis)this; }
}
public class SpecialField<T> : SpecialFieldBase<T,SpecialField<T>>{}
// Yeah it works!
var specialField = new SpecialField<string>()
.Name( "bing" )
.Special();
关于c# - 流利类的通用 'TThis',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1677938/