Vb.net 在继承自另一个类的类中创建表。运动模拟

Vb.net 在继承自另一个类的类中创建表。运动模拟,vb.net,class,inheritance,Vb.net,Class,Inheritance,我已经和一个小问题斗争了好几次,我认为这个问题很容易解决;但是找不到它。也许我在谷歌上找不到正确的方式来表达我的问题。。。不管怎样,我绕了一圈,但我做的方式很不雅观,也很麻烦。我真正想做的是这样的事情: Public Class Form1 Public Class my_classOne Public the_name As String = "" Public the_surname As String = "" End Class

我已经和一个小问题斗争了好几次,我认为这个问题很容易解决;但是找不到它。也许我在谷歌上找不到正确的方式来表达我的问题。。。不管怎样,我绕了一圈,但我做的方式很不雅观,也很麻烦。我真正想做的是这样的事情:

Public Class Form1
Public Class my_classOne
    Public the_name As String = ""
    Public the_surname As String = ""
End Class

Public Class my_classTwo
    Inherits my_classOne
    Public a_table(10) As my_classOne
    Public a_thing As New my_classOne
End Class


Public the_record As New my_classTwo

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim i As Integer
    For i = 1 To 10
        the_record.a_table(i).the_name = "Name is:" + i.ToString
        Label1.Text = the_record.a_table(i).the_name
        the_record.a_thing.the_name = "Name: " + i.ToString
        Label1.Text = the_record.a_thing.the_name
    Next
End Sub
End Class
调试时,我得到了代码行中图片所示的错误:

the_record.a_table(i).the_name = "Name is:" + i.ToString
我做错了什么?如何在
my_Class2
中获取
a_table()
以从
my_classOne
继承

这一行:

Public a_table(10)作为my_classOne
创建一个包含11个元素的数组,但与往常一样,默认情况下,每个元素都是
。您的代码中没有设置这些元素的地方,因此这一行:

the_record.a_table(i)。the_name=“name is:”+i.ToString
正在尝试设置不存在的对象的
名称属性,因为
表(i)

对于
NullReferenceException
来说总是这样的,所以您所需要做的就是正确地调试代码,确定哪个引用为null,然后返回到您想要将该引用设置到的位置

编辑:

这:

the_record.a_table(i)。the_name=“name is:”+i.ToString
在功能上与此等效:

Dim x=_记录。a_表(i)
x、 _name=“name是:”+i.ToString

显然,您是从阵列中获得了一些东西,而不是设置了一些东西。你所做的就像在公交车上没有人的情况下给乘客套上一个跳线。你怎么能在一个不存在的人身上套一个套头衫呢?你不能,这对任何人来说都是显而易见的。这与代码的情况相同。如果从未将任何对象放入数组中,则无法在数组中设置对象的字段。这不是火箭手术。如果你什么也没放进去,那么你什么也得不到。放点东西进去

环顾四周并提供一些帮助后,我应该做的是:

Public Class Form1
Public Class my_classOne
    Public the_name As String = ""
    Public the_surname As String = ""
End Class

Public Class my_classTwo
    Inherits my_classOne
    Public a_table(10) As my_classOne
    Public a_thing As New my_classOne
End Class


Public the_record As New my_classTwo

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim i As Integer
    For i = 0 To 10
        the_record.a_table(i) = New my_classOne
        the_record.a_table(i).the_name = "Name is:" + i.ToString
        Label1.Text = the_record.a_table(i).the_name
        the_record.a_thing.the_name = "Name: " + i.ToString
        Label1.Text = the_record.a_thing.the_name
    Next
End Sub
End Class

请参阅在线评论

请记住.net数组和集合是基于0的。vb.net数组声明为arrayName(UpperBoundIndex)。为了让我们感到困惑,C#数组被声明为arrayName[NumberOfElements]

Public Class my_classOne
    Public the_name As String = ""
    Public the_surname As String = ""
End Class

Public Class my_classTwo
    'The following creates an array capable of holding 11 instances of the my_classOne Class.
    'Currently each element of the array in Nothing (null)
    Public a_table(10) As my_classOne
    Public a_thing As New my_classOne
    Public Sub New()
        'This initializes the 11 elements of the array
        For i = 0 To 10
            a_table(i) = New my_classOne
        Next
    End Sub
End Class

Public the_record As New my_classTwo

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim i As Integer
    For i = 0 To 10
        the_record.a_table(i).the_name = "Name is:" + i.ToString
        Label1.Text = the_record.a_table(i).the_name 'You are just overwriting the contents
        'of the label on each iteration. 
        'On the next line you are overwriting the "the_name" property of each element.
        the_record.a_thing.the_name = "Name: " + i.ToString
        Label1.Text = the_record.a_thing.the_name
        'Only the last value will be visible to the user.
    Next
End Sub

你应该回顾一下。这显然是测试/演示代码,但是有一些问题你绝对不应该在实际/生产代码中重复,所以我想我会在这里解决它们。首先,所有这些字段都应该是属性。其次,
my_class2
应该继承
my_classOne
,这似乎没有什么好的理由。不过,与您最相关的是,您不应该像这样公开数组。一般来说,您应该使用集合类型并将属性设置为只读。这样,调用代码可以获取集合以获取、添加和删除项,但不能用全新集合替换现有集合。整个.NET框架都是这样做的,例如,
控件
数据集.表格
数据表.列
数据表.行
列表框.项
组合框.项
列表视图.列
列表视图.组
,等等,等,但当我试图把东西放进那个数组时,我得到了一条错误消息!不,不是。动动脑筋。你是想把东西拿出来,而不是放进去。您正在尝试获取索引
i
处的元素,并设置该对象的字段,但没有对象,因为您从未在该索引处设置元素。感谢您的帮助。但是你和我一起逃课,因为我是个初学者。你的意思是说我宁愿把这张“公共a_表(10)”放在我的新的I_classOne上?但这也不行。@NorKayak,不,当然不行,因为这是无效的语法。我已经解释了您看到报告的异常的原因,并告诉您如何修复它:设置数组的元素。如果你不懂一些基本的东西,那么是你跳过了,而不是我。对于初学者来说,这不是一个学习如何使用数组的地方。如果你不知道数组是如何工作和如何使用的,你需要对此做一些研究和学习。我上面的代码只是举个例子,让事情简短一些,这样人们可以很容易地看到我的错误在哪里。所以我的问题是,我在哪里修改代码,让它按照我的期望去做?”诺卡亚克说,想想看:如果我做了一个鸡蛋纸盒,把它给你,并告诉你给我做煎蛋饼,你能做到吗?你当然不能!如果一开始没有鸡蛋放进去,你怎么能把鸡蛋从鸡蛋盒里拿出来?事实上,你有一个鸡蛋盒并不意味着你神奇地有了鸡蛋。@NorKayak,“我在哪里修改代码?”。这取决于你。不要指望我们为您设计应用程序。问题是,您从未将任何内容放入数组中。您想在阵列中放置什么内容?这就是修改代码的地方。由你来决定,不是我们。