Существует так много способов сделать это, и это зависит от того, является ли это многопроектным приложением с разными DLL или одним проектом.
Если это один проект, и есть большое количество кода, который вы беспокоитесь о чейнинга/нарушение, то я предлагаю следующее:
- Учитывая класс clsIOProvider, который инстанцированный повсюду, создать модуль modIOProvider в том же проекте.
- Для каждого метода/свойства, определенного в clsIOProvider, создайте тот же набор методов в modIOProvider.
- Реализация этих методов, а также данных экземпляра класса, должна быть клонирована из clsIOProvider в modIOProvider.
- Все методы и свойства в clsIOProvider должны быть перенесены на реализацию в modIOProvider. Класс больше не должен иметь данные экземпляра.
- (необязательно) Если класс требует использования конструктора и деструктора (Initialize/Terminate), переадресуйте их в modIOProvider. Добавьте один счетчик instnace в modIOProvider для отслеживания количества экземпляров. Запустите код инициализации, когда счетчик экземпляров перейдет от 0 до 1, и ваш код завершения, когда счетчик экземпляров идет от 1 до 0.
Преимущество этого в том, что вам не нужно изменять коэффициент в десятки мест, которые используют класс clsIOProvider. Они счастливо не знают, что объект теперь эффективно синглтон.
Если кодирование проэкта с нуля я бы сделал это немного по-другому, но в качестве рефакторинга, который я изложил, должен хорошо работать.
+1 для метода с минимальным воздействием на существующий код. Хотя вы могли бы (1,2) создать новый класс clsConcreteIOProvider, который реализует clsIOProvider. (3) Переместите все реализации из clsIOProvider в clsIOProvider (4) Измените все методы и свойства для перехода к частному экземпляру clsConcreteIOProvider. (5) В Class_Initialise задайте частный экземпляр clsConcreteIOProvider для одного экземпляра (singleton), используя технику из ответа Дины. Одно из преимуществ заключается в том, что вы можете рассчитывать на подсчет ссылок VB/COM, чтобы в случае необходимости вливать/завершать базовый синглтон. – MarkJ
Да, это отличный альтернативный способ сделать это в том же духе, что и нулевой эффект на существующий код. – tcarvin