tom
не следует объявлять As Cat
в первую очередь;процедура feed
является излишней:
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
является IAnimal
, а не Cat
.При доступе через интерфейс IAnimal
, Cat.eat
полностью избыточен и предполагает, что Cat
делает то, чего не делает IAnimal
, что нарушает принципы SOLID: внезапно становится уместным, что IAnimal
являетсяCat
, и это не должно быть, потому что полиморфизм позволяет IAnimal
быть чем-либо, а Принцип замещения Лискова (LSP - "L" в "SOLID") говорит любой код, который работает сIAnimal
должен иметь возможность работать идентично независимо от того, какая реализация этого интерфейса ему предоставлена.
Соблюдение этих принципов означает, что ни одна реализация IAnimal
не должна иметь копию IAnimal
членов на своем интерфейсе по умолчанию(например, Cat.eat
, против IAnimal.eat
), и это полностью снимает ваш балл # 2:
повторно реализует (снова) все методы, чтобы выставить их из подкласса, даже если переопределение не требуется.
Что касается пункта 1 ...
- заново реализовать все методы интерфейса IAnimal
Это требование компилятора, а не причуда VBA: будь то в Java, C #,или VBA, вы не можете сказать «я реализую интерфейс» ... без реализации его участников.Конечно, Java & C # допускают наследование классов, поэтому ваш базовый класс может сказать: «Я реализую интерфейс», реализовать все члены, и производные классы с удовольствием унаследуют их - но тогда это наследование , а не состав больше.