当前位置: 首页 > 知识库问答 >
问题:

用于类java继承的VBA组合

艾善
2023-03-14

在这个问题上展开一点VBA继承模式

我正在VBA中复制一个基本的继承模式,但我想了解是否有更有效和简洁的方法来实现这一点。

考虑一下这个小测试用例。

伊尼马尔。cls公司

'declaration
Public Sub eat()
End Sub

Public Sub breathe()
End Sub

nimal.cls:超类

Implements IAnimal

' method implementation
Private Sub IAnimal_eat()
    Debug.Print "I'm eating something..."
End Sub

Private Sub IAnimal_breathe()
    Debug.Print "I'm brething..."
End Sub

Cat.cls:动物的子类

Private super As IAnimal

Implements IAnimal

Private Sub Class_Initialize()
    Set super = New Animal
End Sub


'#------------------------------------------------
' methods called when object is accessed as an IAnimal implementor. 
' I HAVE TO re-implement all of them also here in the subclass (in java I don't need to. It's sufficient to implement them in the superclass)
Private Sub IAnimal_eat()
    Me.eat
End Sub

Private Sub IAnimal_breathe()
    Me.breathe
End Sub


'#--------------------------------------------------
' subclass-only methods
' To access those methods I MUST DECLARE the object as Cat (Dim tom as Cat)
Public Sub meow()
Debug.Print "meow..."
End Sub


'#------------------------------------------------ 
' superclass methods
' Since I need to declare the cat object as a Cat (see above)
' I'm FORCED TO explicitly re-implement all of the superclass methods,
' even those that I don't need to override
' otherwise I can't access them

'@Override
Public Sub eat()
    Debug.print "I'm  eating a fish!"
End Sub

'I'm forced to re-implement also this method, in order to use it directly on a *Cat* object
'@Unnecessary-Override
Public Sub breathe()
    super.breathe 
End Sub

Test.bas

Sub Main()

    Dim snowball As IAnimal
    Set snowball = New Cat

    Dim tom As Cat
    Set tom = New Cat

    snowball.meow  'ERROR Method or data member not found <---- cannot access the Cat-only method "meow"
    tom.meow  '<--- prints "meow"

    ' creates a Dog, another subclass of Animal
    Dim pluto As Dog
    Set pluto = New Dog

    'create a collection for all my animals
    Dim myPets As Collection
    Set myPets = New Collection

    myPets.Add tom
    myPets.Add pluto

    Call feed(myPets) '<---- prints
                            'I 'm eating a fish
                            'meow...
                            'I 'm eating a bone
                            'woof...

End Sub

' a routine for showing how to manage an heterogeneous collection of animals
Sub feed(animals As Collection)

    For Each a In animals

        a.eat

        If TypeOf a Is Cat Then
            a.meow
        End If

        If TypeOf a Is Dog Then
            a.woof
        End If

    Next

End Sub

通过这样做,我可以:

  • 对Cat和Dog对象调用eat()方法,并具有特定的重写行为

这似乎可行,但很麻烦:假设您需要实现许多动物子类(狗、鸟、犰狳、鸭嘴兽、Demogorgon等等)。上述模式迫使您:

  1. 在所有子类上重新实现IAnimal接口的所有方法

所以问题是:有没有更有效/简洁的方法来实现这个示例(并限制每个子类的代码重写)?

共有1个答案

顾嘉德
2023-03-14

tom首先不应该声明As Catfeedhtml" target="_blank">过程是多余的:

Sub Main()    
    Dim tom As IAnimal
    Set tom = New Cat    
    tom.eat    
End Sub

现在,在Cat类中,这些成员不需要存在:

'Superclass methods --- I have to explicitly override all methods :(
Public Sub eat()
    super.eat 
    Debug.print "...a fish!"
End Sub

在SOLID/OOP中,您针对接口而不是具体类型进行编码——这就是为什么tomI动物而不是Cat。通过它的I动物接口访问,Cat.eat是完全冗余的,并且表明Cat做了I动物不做的事情,这违反了SOLID原则:突然间,I动物Cat变得相关,它不应该是,因为多态性允许I动物是任何东西,并且Liskov替换原则(LSP-“SOLID”的“L”)说任何与I动物一起工作的代码都应该能够以相同的方式工作,无论它给出了该接口的实现。

遵守这些原则意味着任何I动物实现都不应该在其默认接口上有I动物成员的副本(例如Cat.eat,vsIAnimal.eat),这完全消除了您的观点#2:

至于第一点...

  1. 重新实现I动物接口的所有方法

这是编译器的要求,不是VBA的怪癖:无论是在Java、C#还是VBA中,都不能说“我正在实现一个接口”。。。没有实现其成员。当然是Java

 类似资料:
  • 我试图弄清楚Java中的继承和数组,并试图让这些类一起工作。我相信我已经继承下来了,但我仍在为数组部分而挣扎。 有三个文件: 1. Person.java-基类2. Student.java-派生的Person.java3. Family.java-不太确定,我认为这是它自己的基类 人java有两个实例变量,String name和int age,以及各种各样的构造函数toString、equal

  • 我一直在做一个基本的类继承练习,尽管我认为我已经掌握了它的jist,但我的程序并没有按应有的方式工作。我遇到了编译错误,但还没有弄清楚原因——如果你们都能在这里帮助我,那就太好了。 首先,这里有三个文件1。人java——基类2。大学生java——一个派生的Person类。java 3。家庭java——不太确定,我认为它是自己的基类 人java有两个实例变量,String name和int age,

  • 本文向大家介绍JavaScript类的继承方法小结【组合继承分析】,包括了JavaScript类的继承方法小结【组合继承分析】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript类的继承方法。分享给大家供大家参考,具体如下: 在JavaScript 里,被继承的函数称为超类型(父类,基类也行,其他语言叫法),继承的函数称为子类型(子类,派生类)。继承也有之前问题,比如字面量

  • 我试图写一个类(SalaryEmployee)和子类(ComissionEmployee),但我没有得到正确的工资,我不能做SE1.SetSalesMount(20000)。我哪里出了问题? 这是主要的:

  • 1、定义类的继承 说到继承,你一定会联想到继承你老爸的家产之类的。 类的继承也是一样。 比如有一个旧类,是可以算平均数的。然后这时候有一个新类,也要用到算平均数,那么这时候我们就可以使用继承的方式。新类继承旧类,这样子新类也就有这个功能了。 通常情况下,我们叫旧类为父类,新类为子类。 首先我们来看下类的继承的基本语法: class ClassName(BaseClassName): <st

  • 本文向大家介绍JavaScript中的继承之类继承,包括了JavaScript中的继承之类继承的使用技巧和注意事项,需要的朋友参考一下 继承简介       在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。在JS中想要达到继承公用成员的目的,需要采取一系列措施。JS属于原型式继承,得益于这种灵活性,我们既可以