Набор VB6 удаляет, не запускает Class_Terminate

На скомпилированных языках различие является абсолютным.

Java:

//early binding:
public create_a_foo(*args) {
 return new Foo(args)
}
my_foo = create_a_foo();

//late binding:
public create_something(Class klass, *args) {
  klass.new_instance(args)
}
my_foo = create_something(Foo);

В первом примере, компилятор может сделать все виды аккуратного материала во время компиляции. Во втором просто необходимо надеяться, что, кто бы ни использует метод, делает так ответственно. (Конечно, более новые JVMs поддерживают Class<? extends Foo> klass структура, которая может значительно снизить этот риск.)

Другое преимущество - то, что IDE могут горячая ссылка к определению класса, так как это объявляется тут же в методе. Вызов к create_something (Нечто) мог бы быть очень далеко от определения метода, и если Вы смотрите на определение метода, могло бы быть хорошо видеть реализацию.

главное преимущество позднего связывания состоит в том, что оно делает вещи как инверсия управления более легким, а также определенным другим использованием полиморфизма и вводом утки (если Ваш язык поддерживает такие вещи).

5
задан Onorio Catenacci 27 October 2009 в 17:07
поделиться

1 ответ

У нас была аналогичная проблема, но где мы могли отследить незавершение объектов, которые должны быть до экземпляра, хранящегося в другом месте в нашем приложении.

В конце концов, мы получили написать наш метод завершения следующим образом:

Private Sub Class_Terminate()
    Terminate
End Sub

Public Sub Terminate()
    'Do real termination in here'
End Sub

Поэтому, когда вы действительно хотите, чтобы класс был завершен (например, когда вы вызываете g_coll1.Remove), вы также можете вызвать Terminate для удерживаемого объекта.

Я думаю, что вы также можете сделать Class_Terminate общедоступным, но, на мой взгляд, это немного некрасиво.

По вашему пункту (2), я думаю, что это вряд ли будет проблемой с потоками, но я не могу придумать хорошего доказательства / тест с головы до ног. Я полагаю, что вы можете подумать об одном очень важном моменте: вы вручную используете потоки в своем приложении? VB6 не выполняет много потоков автоматически ... (см. Правку ниже)

[ Edit ] MarkJ сообщает нам, что, очевидно, сборка в виде приложения ActiveX означает, что VB6 выполняет автоматически многопоточную обработку. Кому-то еще придется изучить последствия этого, поскольку я не был знаком с этим!

4
ответ дан 15 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: