c# – 使用具有流畅接口的类型推断
我有一个类/接口层次结构.在接口方面我有
IQuery ISelect (inherits IQuery) IUpdate (inherits IQuery) etc 在课堂上我有 QueryBase (implements IQuery) SelectQuery (implements ISelect) UpdateQuery (implements IUpdate) etc 显然,例如,Update类和Select类共享一个WHERE子句,但只有一个Select具有GROUP BY功能,所以理想情况下,如果正在创建更新查询,则流畅的接口将不会提供对GROUP BY功能的访问,但是如果SelectQuery是被创造. 例如,用流利的界面术语 var/Dim select = New SelectQuery() <- returns ISelect explicit .AddColumn(....) <- returns ISelect explicit .AddWhere(....) <- returns ISelect inferred .AddGroupBy(....) <- returns ISelect explicit var/Dim update = New UpdateQuery() <- returns IUpdate explicit .AddSet(....) <- returns IUpdate explicit .AddWhere(....) <- returns IUpdate inferred 我不确定如何实现AddWhere功能. 以前我已经在IQuery接口中声明了AddWhere函数 Function AddWhere(ByVal condition As ICriterion) As IQuery IQuery AddWhere(ICriterion condition) 但是因为它返回了一个IQuery,我正在失去类型推断的好处,所以一旦流畅的接口转换为IQuery,如果它是一个Select查询被创建,我将不再有权访问,AddGroupBy方法. 所以我试图将它作为带有泛型的扩展方法来实现 <Extension> Public Function AddWhere(Of T As IQuery)(Byval this as T,Byval condition as Condition) as T this.SetWhere(condition) Return Me End Function public T AddWhere<T>(T @this,Condition condition) where T : IQuery { @this.SetWhere(condition); return this; } 在QueryBase上使用Friend(内部)方法SetWhere允许我更新WHERE子句.但是因为泛型受限于IQuery,所以它不会找到SetWhere.但是,如果我约束为QueryBase,那么显然,编译器会抛出wobblies,说ISelect无法找到AddWhere方法. 我认为我还没有完全正确的继承链或接口实现,我想要实现的目标. (我希望很清楚!!) 如果有人可以建议我在扩展方法实现方面出错,或者我应该如何更好地构建我的类/接口层次结构,我将不胜感激. 解决方法Public Interface IQuery Function AddWhere() As IQuery End Interface Public Interface IUpdate : Inherits IQuery Overloads Function AddWhere() As IUpdate End Interface Public Interface ISelect : Inherits IQuery Overloads Function AddWhere() As ISelect Function AddGroupBy() As ISelect End Interface Public Class QueryBase : Implements IQuery Public Function AddWhere() As IQuery Implements IQuery.AddWhere ''... Return Me End Function End Class Public Class UpdateQuery : Inherits QueryBase : Implements IUpdate Public Shadows Function AddWhere() As IUpdate Implements IUpdate.AddWhere MyBase.AddWhere() Return Me End Function End Class Public Class SelectQuery : Inherits QueryBase : Implements ISelect Public Shadows Function AddWhere() As ISelect Implements ISelect.AddWhere MyBase.AddWhere() Return Me End Function Public Function AddGroupBy() As ISelect Implements ISelect.AddGroupBy ''... Return Me End Function End Class (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |