如何以编程方式重新定义变量的类?

时间:2016-11-25 10:42:34

标签: arrays vb.net class

好的,所以我有2个类,Note和HeldNote。 HeldNote继承自Note并且仅添加2个变量,以及设置视觉尺寸的不同方式。我有一个未定义数量的项目数组,每个项目被定义为类Note的成员。

偶尔在我的程序中,我希望数组中的其中一个项目是HeldNote而不是Note,在程序运行之前我不知道哪一个。

VB.Net看起来很好,我声明了数组(i)= New HeldNote但是后来不会让我访问HeldNote所拥有的变量但Note没有。在程序中使用Breaks让我相信数组(i)实际上并没有被重新定义为HeldNote而不是Note。

所以,我的问题是,我怎样才能使数组(i)成为HeldNote而不是Note?

我正在使用VB.net 2008。

编辑:我向老师询问了这个问题,他说他不知道并告诉我要查一查。我无法上网(自从我问过他之前一直在寻找)所以我来这里寻求帮助。

3 个答案:

答案 0 :(得分:1)

一些建议:

1)改变你的设计,只有一个类而不是从另一个继承的类。

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

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

答案 1 :(得分:1)

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

“我有一个未定义数量的项目数组,每个项目都被定义为类Note的成员。”

然后所有这些都是“注意”。您可以创建类实例:

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)
...

答案 2 :(得分:1)

数组注释(如果你不确定大小,最好使用List(Of Note))可以存储Note和HeldNote,因为后者来自第一个。

但是,当您在数组中存储HeldNote时,它不会自动转换为Note,它仍然是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 

在这种情况下,您仍然可以使用HeldNote而不使用Object数组,这是因为您丢失了特定Note数组允许的所有强类型(在Object数组中,您可以存储任何内容。一个Button或String make没有区别)