【问题标题】:Overriding abstract classes in VB6在 VB6 中重写抽象类
【发布时间】:2014-08-29 08:57:35
【问题描述】:

我已经知道您在 VB6 中创建了一个接口。 实现接口的类必须实现所有例程。 有没有办法创建一个可以实现某些例程的抽象类之类的东西。 派生类必须实现抽象例程,并且可以覆盖抽象类已经实现的例程。

请注意,我们谈论的是 VB6,而不是 VB.NET 或其他任何东西。 谢谢

【问题讨论】:

标签: class vb6 overriding abstract


【解决方案1】:

我使用的一种解决方法是将基类的实例作为私有成员:

Implements Shape

Dim base as Shape
Dim radius as Single 

Public Function Shape_Area() as Single
  Shape_Area = pi*pi*radius
End Sub

Public Function Shape_PenColour() as Long
  Shape_PenColour = base.PenColour()   ' let the base do its thing
End Function

你可以建立这样的层次结构(对于 Square):

Implements Shape

Dim base as Rectangle

Public Function Shape_Area() as Single
  Shape_Area = base.Area() ' which is Rectangle.Shape_Area which then calls the Shape.Area
End Sub

这确实意味着每个类都必须真正了解它的派生类。这对你来说可能是也可能不是问题。我用过,效果很好。

这确实意味着你必须明确地做更多的工作和每个课程

【讨论】:

    【解决方案2】:

    Visual Basic 6 不支持实现继承,只支持接口继承。你可以阅读更多关于它的信息Here。有一篇很好的文章 here 关于 VB6 中的接口和继承,它可能会引导您在 VB6 功能中找到解决问题的方法。

    【讨论】:

    • 这就是我害怕的。我将发布一个解决方法作为答案。
    【解决方案3】:

    解决方法(不是解决方案):

    例如,一个接口指定例程 A 和 B,实现第二个。
    派生类有一个私有成员作为接口的实例。
    例程 B 的实现只是在其私有成员上调用该方法。
    当然,我们正在处理 2 个不同的对象,但在某些情况下这可能已经足够了。

    【讨论】:

      【解决方案4】:

      实现继承被高估了,而且几乎总是以复杂的设计告终。

      您想要实现的目标(提供基本实现、减少派生类中的重复代码等)可以通过组合和事件来完成

      考虑接口IBase

      Public Function GetArea() As Double
      
      End Function
      

      接口IDerived

      Property Get Base() As IBase
      
      End Property
      

      StdBaseImpl 的常见实现IBase

      Implements IBase
      
      Event CustomizeArea(Value As Double)
      
      Public Function GetArea() As Double
          GetArea = 42
          RaiseEvent CustomizeArea(GetArea)
      End Function
      
      Private Function IBase_GetArea() As Double
          IBase_GetArea = GetArea
      End Function
      

      然后对于派生类,您使用组合并选择要实现的基本事件

      Implements IDerived
      
      Private WithEvents m_oBase As StdBaseImpl
      
      Private Property Get IDerived_Base() As IBase
          Set IDerived_Base = m_oBase
      End Property
      
      Private Sub m_oBase_CustomizeArea(Value As Double)
          Value = Value + 10
      End Sub
      

      您可以使用BeforeXxx + CancelAfterXxx 事件设计基地。您可以下沉多个基地并协调它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-30
        • 1970-01-01
        • 1970-01-01
        • 2013-01-02
        • 2018-07-11
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多