Vb.net在父类型变量中使用子实例

Vb.net在父类型变量中使用子实例,.net,vb.net,class,inheritance,polymorphism,.net,Vb.net,Class,Inheritance,Polymorphism,我更熟悉Java如何处理多态性,所以我可能在vb中做得不对 我尝试使用多态性和继承来创建一个可以采用多种形式的实例, 问题是变量被实例化为父类型并初始化为子类实例,但我无法访问子属性 下面是我尝试做的一个示例: sub main() Dim animal as Animal 'instantiated as parent type 'some code later animal= New Dog() 'no problems here

我更熟悉Java如何处理多态性,所以我可能在vb中做得不对

我尝试使用多态性和继承来创建一个可以采用多种形式的实例, 问题是变量被实例化为父类型并初始化为子类实例,但我无法访问子属性

下面是我尝试做的一个示例:

sub main()
  Dim animal as Animal           'instantiated as parent type
  'some code later
  animal= New Dog()              'no problems here
  dim legs = animal.legs         'this works
  dim fur = animal.fur           'this is an error 
end sub

Public Class Animal
  Property legs as integer
End Class 

Public Class Dog
  inherits Animal
  Property fur as Boolean = True
End Class

如果我能让它工作就太好了。

这实际上是声明,而不是实例化

像动物一样暗淡的动物

如果你知道它是一种动物,那么就这样创造它:

暗淡的小狗像新狗一样

你唯一需要把狗当作动物对待的时候就是你在它的腿上表演什么

例如,在动物类中:

你可以像这样从狗那里打电话:

正如Proputix所评论的,基类不应该知道任何关于派生类的信息,因此当狗被视为动物类型时,IDE无法定位Fur属性

也许你想要的是界面上的东西


以这种方式使用接口意味着您可以始终引用任何动物的腿和毛皮。

我现在看到了,但我正在寻找类似“dim animal as Object”的东西,然后我可以做“animal=New Dog”,它将成为一个Dog类类型,我相信Java会这样做。愚蠢的Java宠坏了我。由于对象在这种情况下工作并且不会导致错误,我只需要更加小心。我希望它能够呈现多种形式,因为它将位于一个对象中,该对象将具有“猫”或“狗”,但不能同时具有“猫”或“狗”,即具有类类型属性的类犬舍animal@Plutonix我不知道你的意思,你能举个例子吗?这可能是我正在寻找的方法。我正在寻找一种方法,在这种方法中,我可以声明一个变量/容器,并将类似的类放入该容器中。所以稍后我会有一些逻辑,根据里面的内容做不同的事情。目前看来,我最好的方法是忘记继承,将所有属性保留在一个类“Animal”中,只需检查一个名为“animalSpecies”的属性,以确定我需要对它做什么。类似的类建议继承或接口,不排除知道它们是什么。这两者都是为了做不同的事情取决于*的类型。Dog.Speak与Cat.Speak@pulse Sans inheritation的代码完全不同。如果代码块可以做不同的事情,那么“不同的事情”是由一个不同的类完成的,比如修饰员或看门人,Cat和Dog类将只包含属性,而不包含方法。因此,如果species=dog,groomer执行这些操作,如果species=cat,则执行此操作,等等。然后,您可以为基或接口提供一个Groom方法,dog类可以覆盖/实现该方法。
Shared Sub AmputateLeg(patient As Animal)
    patient.Legs = patient.Legs - 1
End Sub
Dim doggo As New Dog()
doggo.Legs = 4
Animal.AmputateLeg(doggo)
Console.WriteLine(doggo.Legs) ' Shows 3.
Public Interface IAnimal
    Property Fur As Boolean
    Property Legs As Integer
End Interface

Public Class Dog
    Implements IAnimal

    Public Property Fur As Boolean = True Implements IAnimal.Fur
    Public Property Legs As Integer = 4 Implements IAnimal.Legs
End Class

Public Class Duck
    Implements IAnimal

    Public Property Fur As Boolean = False Implements IAnimal.Fur
    Public Property Legs As Integer = 2 Implements IAnimal.Legs
End Class