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