Похоже, вы все поняли задом наперед.Прежде всего, поговорим о принципе подстановки Лискова.Это говорит о том, что любой тип должен быть заменен базовым типом.Это также относится к шаблону посетителя.
Если у вас есть метод с именем void Accept(IVisitor visitor)
, не должно иметь значения, посещает ли FancyVisitor
или SipleVisitor
.
ВесьИдея с шаблоном посетителя состоит в том, что субъект (т. е. класс, который посещается) не должен знать ничего о посетителе больше, чем контракт (базовый класс или интерфейс), который он реализует.И каждый Visitor
класс должен быть определенным для определенного посещаемого класса.
И это проблема с вашим кодом.Вы пытаетесь создать общий класс Visitor, который может посещать все компоненты вашей системы.Это совершенно неправильно.
На мой взгляд, у вас есть два варианта:
Вы хотите собирать одинаковую информацию от всех компонентов системы.
Easy.Создайте новый интерфейс, который реализуют все компоненты системы.Затем измените посетителя на Visit(ISystemCompoent subject)
.
. Вы хотите собирать различную информацию от каждого компонента системы
Затем вам нужно создать различных * 1029.* базовые классы посетителей (или интерфейсы).