我正在构建一个流畅的接口,其中我有一个包含大部分流畅逻辑的基类,以及一个添加一些特殊行为的派生类。我面临的问题是从派生类型的实例调用时基类中流利方法的返回类型。调用基类的方法后,只有基类的方法可用于进一步的流畅调用。
更改调用方法的顺序将有助于它编译,但它会降低它的可读性,这对于流畅的接口来说有点重要。有没有办法为基类定义某种“This”类型,以便所有方法返回相同的类型。
例子
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# :( 但至少表达了我想如何编写接口。
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; }
}