Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net “怎么做?”;超载“;在儿童班工作?_Vb.net_Inheritance_Properties_Overloading - Fatal编程技术网

Vb.net “怎么做?”;超载“;在儿童班工作?

Vb.net “怎么做?”;超载“;在儿童班工作?,vb.net,inheritance,properties,overloading,Vb.net,Inheritance,Properties,Overloading,我有一个基类和一个子类,它们都有相同的属性,我不明白为什么VB要我在子类中使用“重载”。不同之处在于,属性的子类版本是共享的,而父类基本上用于结构。属性如下所示: Public MustInherit Class Parent Public ReadOnly Property Species As String Get Return "Should get species from a child." End Get En

我有一个基类和一个子类,它们都有相同的属性,我不明白为什么VB要我在子类中使用“重载”。不同之处在于,属性的子类版本是共享的,而父类基本上用于结构。属性如下所示:

Public MustInherit Class Parent
    Public ReadOnly Property Species As String
        Get
            Return "Should get species from a child." 
        End Get
    End Property
End Class

Public Class Child
    Inherits Parent
    Public Shared ReadOnly Property Species As String
        Get
            Return "Species1"
        End Get
    End Property
End Class
Species
在带有警告消息的子类中的行
公共共享只读属性Species中标记为String

属性“Species”隐藏在基中声明的可重载成员 类“Parent”。如果要重载基本方法,请使用此方法 必须声明为“重载”

我想知道的是,为什么它想让它过载?重载通常是在不同的参数被传递到具有相同名称的函数中时使用的,这一点有很好的文档记录,但我没有找到任何解释为什么在这种情况下突然建议重载

注意:代码正确地报告“Species1”,而不管是否有“重载”或是否增加了我对其实际功能的混淆

如果要重载基本方法,则必须将此方法声明为“重载”

错误消息太笼统了。注意它是如何谈论方法的,即使警告是关于属性的。不能重载属性

如果我是法国国王,我会写这样的错误消息:

属性'Species'隐藏从'Parent'基类继承的'Species'属性。如果打算隐藏,请使用Shadows关键字来抑制此警告。如果不打算隐藏,请更改属性的名称


此警告几乎永远不应该被忽略,因为它几乎总是识别代码气味。对Child.Species使用共享关键字是非常奇怪的,几乎肯定不是你想要的。任何通过父类型引用使用子对象的代码都将始终获得错误的物种名称,因为它将使用基本属性。这里更明智的做法是声明Parent.Species属性可重写,并在Child.Species属性声明中使用Overrides关键字,而不使用Shared。

如果对成员进行阴影处理,则调用时基类仍将使用其成员的版本。例如,如果基类中的一个函数名为Species,它仍然会得到值“Should get Species from a child”

在这种情况下,重载将导致基类中的函数使用子类的值

为了让这更清楚一点。。。以下代码的消息框显示“原始值”,而不是“新值”


我想这可以说明一些问题:确实如此!因此,对于一个基类中只有一个属性或方法版本的情况,您是隐藏还是重载并不重要,因为它们都将覆盖基类属性的唯一版本,而默认属性是隐藏,因此即使您没有声明任何内容,也会被覆盖。我想让子类拥有一个共享属性,这样就可以在不创建子类实例的情况下查看该属性。因此,我也不能使用“覆盖”。这会不会意味着我应该彻底清除基地的物种财产?是的。我仍然很确信你做错了。但是你不需要我的帮助,一旦你开始使用这些类,你就会发现。好吧,下面我们来探索如何根据经验编写更好的代码!您已经回答了我关于属性中“重载”的问题,非常感谢!
    Public Class Form1
        Dim X As New Child
        Dim Y = MsgBox(X.ShowMe)
    End Class

    Public Class Parent

        Public Function ShowMe() As String
            Return member
        End Function

        Public Property member As String = "Original value"

    End Class

    Public Class Child
        Inherits Parent

        Public Property member As String = "New value"

    End Class