微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐