【问题标题】:Vb.net Using child instance in a parent-typed variableVb.net 在父类型变量中使用子实例
【发布时间】:2018-05-21 18:00:31
【问题描述】:

我更熟悉 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

如果我能做到这一点,那就太好了。

【问题讨论】:

  • 我现在看到了,但我一直在寻找像“dim animal as Object”这样的东西,然后我可以做“animal = New Dog()”,它将成为我相信 Java 的 Dog 类类型做。愚蠢的 Java 宠坏了我。
  • 由于 Object 在这种情况下工作并且不会导致错误,我只需要更加小心。我希望它能够呈现多种形式,因为它将位于一个对象中,该对象要么具有“猫”或“狗”,但不能同时具有两者,即具有类类型动物属性的类犬舍

标签: .net vb.net class inheritance polymorphism


【解决方案1】:

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

Dim animal as Animal

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

Dim doggo As New Dog

您唯一需要将Dog 视为Animal 的情况是,如果您在Legs 上执行某些操作。

例如(在Animal 类中):

Shared Sub AmputateLeg(patient As Animal)
    patient.Legs = patient.Legs - 1
End Sub

您可以像这样从Dog 拨打电话:

Dim doggo As New Dog()
doggo.Legs = 4
Animal.AmputateLeg(doggo)
Console.WriteLine(doggo.Legs) ' Shows 3.

正如 Plutonix 评论的那样,基类不应该知道派生类的任何信息,因此当 Dog 被视为 Animal 类型时,IDE 无法找到 Fur 属性

也许你想要类似Interface 的东西

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

以这种方式使用Interface 意味着您可以随时引用任何动物的LegsFur

【讨论】:

  • @Plutonix 我不确定你的意思,你能举个例子吗?这可能是我正在寻找的方法。
  • 我正在寻找一种可以声明变量/容器并使类似的类适合该容器的方法。所以以后我会有一些逻辑,根据里面的内容做不同的事情。目前看来我最好的方法是忘记继承并将所有属性保留在一个类“Animal”中,只需检查一个名为“animalSpecies”的属性以确定我需要用它做什么。
  • “相似类”建议继承或接口,不排除知道它们是什么。两者都旨在“根据类型做不同的事情*。Dog.Speak() 将是与 Cat.Speak() 完全不同的代码@pulse Sans 继承你有大量 If 代码块来做不同的事情
  • 正在做的“不同的事情”完全由不同的类完成,比如美容师或看护人,猫和狗类将只包含属性,没有方法。所以如果物种=狗,美容师做这些事情,如果物种=猫,那么做这些,等等。
  • 然后你可以给 Base 或 Interface 一个 Groom 方法,Dog 类可以覆盖/实现。
猜你喜欢
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2017-09-26
相关资源
最近更新 更多