在这个问题上展开一点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
通过这样做,我可以:
这似乎可行,但很麻烦:假设您需要实现许多动物子类(狗、鸟、犰狳、鸭嘴兽、Demogorgon等等)。上述模式迫使您:
所以问题是:有没有更有效/简洁的方法来实现这个示例(并限制每个子类的代码重写)?
tom
首先不应该声明As Cat
;feed
html" 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中,您针对接口而不是具体类型进行编码——这就是为什么tom
是I动物
而不是Cat
。通过它的I动物
接口访问,Cat.eat
是完全冗余的,并且表明Cat
做了I动物
不做的事情,这违反了SOLID原则:突然间,I动物
是Cat
变得相关,它不应该是,因为多态性允许I动物
是任何东西,并且Liskov替换原则(LSP-“SOLID”的“L”)说任何与I动物
一起工作的代码都应该能够以相同的方式工作,无论它给出了该接口的实现。
遵守这些原则意味着任何I动物
实现都不应该在其默认接口上有I动物
成员的副本(例如Cat.eat
,vsIAnimal.eat
),这完全消除了您的观点#2:
至于第一点...
这是编译器的要求,不是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属于原型式继承,得益于这种灵活性,我们既可以