我有一个类/接口层次结构。在接口方面我有
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方法。
我认为我还没有完全符合我想要实现的继承链或接口实现。
(我希望很清楚!)
如果有人可以建议我在扩展方法实现方面出错,或者我应该如何更好地构建我的类/接口层次结构,我将不胜感激。
答案 0 :(得分:1)
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
答案 1 :(得分:0)
也许您可以在层次结构中使用其他界面,例如:
interface IQuery
interface IConditional : IQuery
interface ISelect : IConditional
interface IUpdate : IConditional
然后IConditional
接口可以直接在接口定义中使用AddWhere
方法,也可以作为IConditional
类型约束的扩展方法。