Полиморфное поведение в VB6 - PullRequest
4 голосов
/ 06 апреля 2010

Я недавно заметил ключевое слово CallByName в VB6.

Поскольку для этого требуется объект, имя процедуры, «тип вызова» и массив аргументов, можно ли это использовать для «подделки» некоторых типов полиморфного поведения?

Я могу сделать 2 класса, класс A и B, каждый с одним и тем же методом Foo, и сделать:

Dim list As New Collection
Dim instanceA As New ClassA
Dim instanceB As New ClassB
Dim current As Object

Call list.Add(instanceA)
Call list.Add(instanceB)

For Each current in list
  Call CallByName(current, "methodName", vbMethod)
Next

Кто-нибудь делал это раньше? Проблемы? Ужасная идея или гениальная идея? Последствия? Непреднамеренные последствия?

Ответы [ 3 ]

14 голосов
/ 06 апреля 2010

Почему фальшивый полиморфизм? VB6 имеет настоящий полиморфизм в виде интерфейсов:

' Interface1.cls '

Sub Foo()
End Sub

' --------------------------------------------- '

' Class1.cls '
Implements Interface1

Private Sub Interface1_Foo()
    ? "Hello from class 1"
End Sub

' --------------------------------------------- '

' Class2.cls '
Implements Interface1

Private Sub Interface1_Foo()
    ? "Hello from class 2"
End Sub

' --------------------------------------------- '

' Module1.mod '

Dim x As Interface1
Set x = New Class1
Call x.Foo()
Set x = New Class2
Call x.Foo()
6 голосов
/ 06 апреля 2010

Хотя я согласен с г-ном единорогом, я не могу не отметить, что CallByName также не нужен (в данном случае), потому что вы можете вызывать метод с использованием стандартного синтаксиса метода, и это приведет к позднему связыванию т.е. не решен во время компиляции) вызов:

...
For Each current In list
    Call current.methodName
Next

Реальное использование CallByName - ссылаться на имена / свойства методов, где имя происходит из (возможно, вычисляемого) строкового значения ... на мой взгляд, абсолютная мерзость.

2 голосов
/ 06 апреля 2010

Если вы находитесь в ситуации, когда вы унаследовали огромный проект без единого интерфейса в нем (звучит так, как вы), то CallByName является отличным инструментом для имитации полиморфизма.Я использую это все время - никогда не было никаких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...