Vb.net 我应该如何将子类存储在可枚举中,以及如何正确访问它们?

Vb.net 我应该如何将子类存储在可枚举中,以及如何正确访问它们?,vb.net,Vb.net,如果我尝试使用它而不先施放它,我会出错,因此我在尝试获取我的对象之前施放它: Public Class UniqueList(Of T As BaseClass) Inherits List(Of T) Public Overridable Overloads Sub Add(value As T) If Not Me.Contains(value) Then MyBase.Add(value) End Sub Public Function [Ge

如果我尝试使用它而不先施放它,我会出错,因此我在尝试获取我的对象之前施放它:

 Public Class UniqueList(Of T As BaseClass)
   Inherits List(Of T)

    Public Overridable Overloads Sub Add(value As T)
        If Not Me.Contains(value) Then MyBase.Add(value)
    End Sub

 Public Function [Get](val As integer) As T
        Return Me.Where(Function(cb) cb.Id = val)(0)
    End Function

 End Class
因此,我尝试在我的UniqueList类中创建一个新函数,为我强制转换它:

dim mylist as new UniqueList(of Baseclass)
mylist.add(new ChildClass(1))

dim x as ChildClass= (mylist.get(1))
x.RandomMethod() ... 
但我总是会出错,说T值不能转换成ChildClass。。。有没有办法让这个函数返回正确的对象

编辑:我无法将其更改为ChildClass列表

编辑:按您的意愿声明它们

Public Function [GetChildClass](val As integer) As ChildClass
    Return DirectCast(Me.Where(Function(cb) cb.Id = val)(0), ChildClass)
End Function

您可能正在寻找以下内容:

 Class BaseClass 
   public id as integer
   public sub new(id as integer)
     me.id = id
   end sub
 end class

 Class ChildClass
    inherits BaseClass
    Public sub New(id as integer)
      mybase.new(id)
    end sub

    public sub randomMethod()
     'do nothing
    end sub
 end class

注意-如果未找到ChildClass类型的元素,则此操作将失败。您可以通过使用
.FirstOrDefault
而不是手动将
(0)
索引到第一个元素中来防止失败<如果找不到元素,code>FirstOrDefault将不返回任何内容。

请添加基类和父类的声明。我希望了解继承层次结构。你的类命名很混乱,因为基类和父类应该是同一个意思,它们在英语中是同义词。这样更好吗?UniqueList的
Add
方法有问题;您不应该调用
Me.Add
,因为它将导致无限循环。你想调用
MyBase.Add(value)
因为你是从
List(Of T)
hoo右边派生出来的,我刚才看到了。Thanksupblic函数[GetParent](val为整数)作为ChildClass返回DirectCast(Me.Where(Function(cb)cb.Id=val)(0),ChildClass)结束函数这对你有用吗?@ThierrysavardSauier:啊,不,对不起,我试着没有它,以为你的意思是你创建它是为了解决一些问题,而我正试图复制它。GetParent的问题是基类不能强制转换为ChildClass。您不能将父类型强制转换为更具体的/子类型,只有另一种方式,这是根据基本继承原则进行的。那么,不应该是另一种方式,如果一个对象不从基类继承,它就不能插入列表中。。。因此,我想强制将其转换为PaleTrave.@ TyryySavaDaSuxi:好的,考虑一个例子,只使用BaseClass类型的对象填充唯一列表。在这种情况下,GetParent总是会失败,因为它试图将第一个元素(即基类)强制转换为ChildClass,这是不可能的。是的,对我来说,这是正确的,我将为每种类型创建一个get函数。。。基类无论如何都是“必须继承的”。。。
Public Function [GetParent](val As integer) As ChildClass
  Return DirectCast(Me.OfType(Of ChildClass).
    Where(Function(cb) cb.id = val)(0), ChildClass)
End Function