2016-11-25 76 views
0

好的,所以我有2个类,Note和HeldNote。 HeldNote从Note中继承,并只添加2个变量,另外还有一种设置视觉尺寸的不同方式。我有一个未定义数量的项目数组,每个项目都定义为类Note的成员。如何以编程方式重新定义变量的类别?

偶尔我的节目中,我想在数组中某一个项目是一个HeldNote而不是注意了,我不知道是哪一个,直至程序运行。

VB.Net似乎罚款我声明数组(I)=新HeldNote但随后不会让我访问HeldNote有,但注意不变量。在程序中使用Breaks使我相信数组(i)实际上并未被重新定义为HeldNote而不是Note。

所以,我的问题是,怎样才能让我阵列(I)的HeldNote,而不是注意?

我用VB.net 2008

编辑:我问过我的老师对这个问题,他说他不知道,叫我去看看它。我在网上没有任何东西(自从我问他之前一直在寻找),所以我来到这里寻求帮助。

+0

你为什么使用VB2008? – Dai

+0

它是一个学校项目,由于某种原因,我的学校决定这就是我们将要使用的。 – Hado

+0

这就是为什么你应该更喜欢Aggregation over Inheritance。想象一下,你只有一个'Note'类和一个'NoteVisualProperties'类。 'Note'类不是继承,而是'NoteVisualProperties'的一个实例。如果你有一个“正常的”注意这个实例可能是空的或用默认值定义的。在你的“HeldNote”的情况下,你会通过属性对象设置额外的变量和维度的东西。 –

回答

1

注意的阵列(最好使用一个List(注),如果您不确定大小),可储存在注意和HeldNote因为后者导出从首先。

但是,当你存储的HeldNote的阵列,它不会自动在一份报告中转化的,它仍然是一个HeldNote,你需要的是尝试铸造回的HeldNote

例如

Sub Main 

    Dim X(2) As Note 

    X(0) = New Note() WIth {.Note = "A Message"} 
    X(1) = New HeldNote() With {.Note = "Held Message", .Author = "Steve"} 


    Dim h As HeldNote 

    h = TryCast(X(0), HeldNote) 
    If h Is Nothing Then 
     Console.WriteLine("X(0) is NOT an HeldNote") 
    Else 
     Console.WriteLine(h.Author) 
    End If 

    h = TryCast(X(1), HeldNote) 
    If h Is Nothing Then 
     Console.WriteLine("X(1) is NOT an HeldNote") 
    Else 
     Console.WriteLine(h.Author) 
    End If 
End Sub 

Public Class Note 
    Public Note As String 
End Class 

Public Class HeldNote 
    Inherits Note 
    Public Author As String 
End Class 

在thisway你仍然有HeldNote不使用对象的数组,它是什么,以避免因为你失去了通过特定的注意阵列允许所有的强类型(在你可以存储任何一个对象数组。一个按钮或一个字符串没有区别)

+0

谢谢,这是有道理的,似乎比将所有对象声明为对象更好(正如你所解释的)。 – Hado

1

几点建议:

1)改变您的设计和只有一个类,而不是一个从其他继承。

2)声明你的数组类型为Object。 Object数组的每个元素可以是不同的类型。这样你可以在运行时分配每个元素的类型。

Dim notearray As Object() = New Object() {New Note(), New HeldNote(), New HeldNote(), New Note()} 
+0

选项2实际上听起来很完美。谢谢。 (我想使用选项1,因为对此的要求是使用类继承) – Hado

+2

对不起,但声明一个Object类型的数组就像在德国高速公路上驾驶20mp/h的法拉利一样。你完全错过了OO概念的力量,如Polymprphism,Aggregation,Inheritance和非常强大的泛型概念...... –

+1

如果我是你的老师,我不会给你一个高分,使用Object数组......一个对象的阵列它就像玛丽Poppins袋 – Caveman

1

这不是一个代码问题,它几乎是一个OO问题。

“我有物品的未定义数量的阵列,定义为类注的成员的每个项目。”

然后所有的人都“注意”。你可以创建类的实例,以便:

Note theNote = new HeldNote() 

,但你不能“降级”上执行的情况下宣称这样:

Note theNote = new Note()". 

如果你需要“随机”的类型更改,您可以创建一个ListOf(HeldNote)。 然后,你就可以决定真正的类型,以便:

Dim aList as new ListOf(HeldNote) 
aList.add(new HeldNote()) 
aList.add(new HeldNote()) 
aList.add(new HeldNote()) 

Dim oNote as Note 
oNote = Ctype(aList(0),Note) 

Dim oNote as HeldNote 
oNote = aList(1) 
... 
+1

列表(Of HeldNote).... – Steve