• Организация классов в C#, передача в парамет разных типов классов

    vmysla
    @vmysla
    параметр context (типа B) формируется системой и доступен только для чтения, и переломной встала задача искусственно подсунуть свой context (типа D) с необходимыми методами и данными.

    это вам для тестов надо, или «вообще»? если «вообще», то вы что-то не так спроектировали. жаль — не понятна суть задачи… задумайтесь — вы хотите в существующий класс, который имеет свой контекст — подсунуть чужой. как поведут себя остальные внутренние методы? какой контекст они будут использовать во время вашего «специального вызова», до и после него? а если какая-то функция сохранит что-то из «другого контекста», как это повлияет на поведение класса?

    не знаю что вы делаете, но есть пару вариантов:

    0. если вы пишете тесты — используйте моки или стабы (если это действительно необходимо)

    1. BD — просто «соединение» + влияет на context
    тут все просто — фабрика: IBdContext getBdContext(C BD), почти как у вас

    2. BD — умная, не просто что-то делает а и что-то запоминает + влияет на context
    почти тоже самое, но «C BD» может оказаться фабрикой, и как минимум синглтоном.

    3. context — просто объект + влияет на BD
    паттерн мост. делайте свои реализации IContext, и передавайте им в конструктор «C BD»

    4. context — умный, не просто что-то делает а и что-то запоминает + влияет на BD
    фабрика IContext(C BD)

    5. все умные и что-то помнят — фантазируйте. что-то не так с дизайном.
    6. все «тупые» — используйте статические хелперы.

    999. задумайтесь, если вам «на мгновенье» надо подсунуть «инопланетный объект» — что то не так.
    НО!:
    А. если это методы «компарации» — передавайте контекст как опциональный параметр к функции
    Б. если у вас древовидная структура с гибкой логикой — используйте композит.

    (какой вопрос — такой ответ)
    Ответ написан