【问题标题】:What mistake am I making when creating a constraint in generics?在泛型中创建约束时我犯了什么错误?
【发布时间】:2011-05-13 20:38:13
【问题描述】:

在 asp.net 2.0 中,我有几个使用泛型定义的“下拉菜单”(例如眼睛颜色、头发颜色等)。这些领域都是典型的; id、text 等。所有这些都被定义为它们自己的类,它们必须实现我创建的名为 ILookup 的接口。但是,当我尝试使用以下方法返回此类的 List 时:

ddlEyeColor.DataSource = luMgt.GetLookUpItemList(Of EyeColor)()

调用BC层:

  Public Function GetLookUpItemList(Of t As {ILookup, New})() As List(Of t)
    Dim luMgt As New LookupMgt
    Return luMgt.GetLookUpItemList(Of t)()
End Function

它调用 DBC 层,部分是......

    Public Function GetLookUpItemList(Of t As {ILookup, New})() As List(Of t)

    Dim lstGenericList As New List(Of t)
    'rest of code to populate the list here
    end function

错误消息声称 EyeColor 没有实现 ILookup。

错误 21 类型参数“EyeColor”不继承或实现约束类型“ILookup”。

但这里是 EyeColor 类的开始......

Public Class EyeColor
Implements ILookup

这是完整的界面......

公共接口 ILookup

Property ID() As Int32
Property Text() As String
Property Description() As String
Property Status() As Status
Property OrderID() As Int32
ReadOnly Property LookUpType() As LookUpType

结束界面

在这里,在 EyeColor 类中,我正在实现接口的属性

Public Overrides Property Description() As String Implements ILookup.Description
    Get
        Return MyBase.Description
    End Get
    Set(ByVal value As String)
        MyBase.Description = value
    End Set
End Property

Public Overrides Property ID() As Integer Implements ILookup.ID
    Get
        Return MyBase.ID
    End Get
    Set(ByVal value As Integer)
        MyBase.ID = value
    End Set
End Property

Public Overrides Property OrderID() As Integer Implements ILookup.OrderID
    Get
        Return MyBase.OrderID
    End Get
    Set(ByVal value As Integer)
        MyBase.OrderID = value
    End Set
End Property

Public Overrides Property Status() As Status Implements ILookup.Status
    Get
        Return MyBase.Status
    End Get
    Set(ByVal value As Status)
        MyBase.Status = value
    End Set
End Property

Public Property EyeColor() As String Implements ILookup.Text
    Get
        Return _eyeColor
    End Get
    Set(ByVal value As String)
        _eyeColor = value
    End Set
End Property

Public ReadOnly Property LookUpType() As LookUpType Implements ILookup.LookUpType
    Get
        Return BE.LookUpType.EyeColor
    End Get
End Property

【问题讨论】:

  • EyeColor 类中是否存在编译器错误?如果接口还没有完全实现,至少NotImplementedExceptions编译器错误会以这种方式“级联”。
  • 为什么这些属性被声明为覆盖?这里的某个地方有基类吗?

标签: vb.net generics constraints


【解决方案1】:

我赞成 Jay 的评论。他完全正确。简单地将Implements ILookup 添加到您的类定义中并不会真正实现该接口。

您需要创建接口规定的实际方法。

【讨论】:

    【解决方案2】:

    我认为您需要将方法签名更改为:

    Public Function GetLookUpItemList(Of T As {ILookup, New})() As List(Of ILookup)
    

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多