我有一个基类,称为原始图形。从这个类派生的是几种不同类型的图形,正方形,矩形,直线等。
我将这些图形存储在继承collectionbase的对象中。这会导致问题,因为在将它们添加到集合时,我无法访问派生类中的任何成员。 这是我的primitivecollection类的默认属性
Public Class PrimitiveCollection
Inherits CollectionBase
''' <summary>
''' Get or set a primitive object by index
''' </summary>
Default Public Property Item(ByVal index As Integer) As Primitive
Get
Return DirectCast(List(index), Primitive)
End Get
Set(ByVal value As Primitive)
List(index) = value
End Set
End Property
我目前的解决方法是将所有公共成员放在基类中,但是当我添加更多需要仅可用于派生类的成员的派生类时,这开始看起来很丑陋
答案 0 :(得分:1)
您的问题是关于继承和接口。以下是我的意见
每个基元应该实现一个接口IPrimitive。集合中的每个元素都实现了IPrimitive,而IPrimitive中唯一的东西是适用于所有类型的IPrimitive的东西。例如:Draw()
因此,在处理集合时,您有一组可绘制对象。如果您打算将集合作为仅矩形的集合使用,则应使用List&lt; Rectangle&gt;而不是一组原始人。
将更多属性放在基类(或IPrimitive)上是一个坏主意,因为它们对所有对象都没有意义。宽度可以用于矩形,但在使用梯形或三角形时会变得阴暗。相反,Commonality应该尽可能少地将对象作为集合来处理。当你需要使用对象作为派生类时,你应该在不使用集合的情况下引用它们。
答案 1 :(得分:1)
如果您在一个集合中存储多种类型的对象,那么您需要在它们之间进行转换以访问特定于类型的成员,是的。
如果你实际上在一个集合中存储了一个派生类型的多个对象,你应该看一下使用泛型,这样集合仍然是强类型的(即编译器知道集合只包含派生类型的实例) )。
答案 2 :(得分:0)
您需要将集合中的实例强制转换为派生类型,以便访问其特定成员。
我将添加一个例子:
PrimitiveCollection primitives = GetPrimitives() ' this gets a mixture of types
If GetType(PrimitiveRectangle) = primitives[0].GetType() Then
' this is a PrimitiveRectangle object
PrimitiveRectangle rect = CType(primitives[0], PrimitiveRectangle)
' now you can access specialized members through rect
End If
我在几年内没有使用VB.NET,因此语法可能存在问题......