【问题标题】:VB.Net Early Binding class to variable conditionallyVB.Net Early Binding 类有条件地变量
【发布时间】:2014-09-04 22:18:45
【问题描述】:

我有一个 VB.Net 应用程序,它根据条件将两个类之一分配给一个变量。目前,我正在使用非常直接的后期绑定来执行此操作。我正在寻找任何其他可能提高性能的解决方案。

简化示例,我有 CAT 和 DOG 类,它们都继承自 ANIMAL 类。我的代码如下所示:

Dim Pet as Object
Dim Allergic as Boolean = True

If Allergic then 
    Pet = New DOG
Else
    Pet = New CAT
End If

If Allergic then 
   Pet.Bark
   Pet.Fetch
Else
   Pet.Meow
   Pet.UseLitterBox
End Else

无论如何要这样做,以便我可以尽早绑定到分配的 ANIMAL 子类?

【问题讨论】:

  • 动态调度与后期绑定不同。将宠物声明为动物。使用带有 Overridable 或 MustOverride 关键字的多态性。任何有关 VB.NET 编程的介绍性书籍都会教你如何做到这一点。
  • 我理解您所指的概念。我想我需要包括更多细节。派生类都具有许多与基类或彼此不同的方法和属性。我是否需要在基类中为所有这些方法创建可覆盖/必须覆盖的方法 - 即,如果我想从 Pet 对象调用任何一个,我是否需要向 ANIMAL 类添加可覆盖的“Meow”和“Bark”方法?还是有更简单的方法?
  • 使用您的示例,如果您有一只狗并且它继承自动物,要使其成为“Bark”,您必须将您的动物 CTYPE() 到狗才能访问“Bark”方法,和你的动物给一只猫访问“喵”的方法。否则你需要使用后期绑定。关键是,当您拥有动物时,您可以使用类似的方法,例如步行、坐等。要访问特定的方法,您需要特定的 Cat/Dog。
  • 对,但我可以使用相同的变量(示例中的“Pet”),有条件地将其设置为 DOG 或 CAT 类,而无需后期绑定。如果我将 Pet 声明为 Animal,上面的代码会给出一个错误,即 Bark 不是 Animal 类的方法。
  • 另外,我可以不用在 Animal 类中声明“Bark”一个空的、可覆盖的方法来做到这一点。我在“Cat\Dog”中使用的真实示例是非常复杂的派生类,具有许多独特的方法和属性。

标签: .net vb.net class inheritance


【解决方案1】:

不,你不能这样做。 VB.NET 要求在编译时知道类型。

通常,您应该尝试通过多态来处理这个问题。您不应该将MeowBark 都放在Animal 类上(这将违反所谓的里氏替换原则,因为Meow 不适合Dog,反之亦然)。

相反,您需要一个名为 Animal.MakeNoise 之类的方法,Dog 会被吠叫覆盖,Cat 会被喵喵叫覆盖。通过这种方式,MakeNoise抽象了要制造的特定噪声的细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2017-11-28
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多