Задать вопрос

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

Добрый день!
Не очень сильно знаком с C#, пытаюсь решить задачу (если это вообще возможно), есть класс А который выполняет определенные операции в его конструктор передается 2 параметра, экземпляр класса и БД (он не затрагивает мою проблему). Вкратце его структура:
class A {
   protected B context;
   public A(B context, C BD){
       context = context;
   }
}

параметр context (типа B) формируется системой и доступен только для чтения, и переломной встала задача искусственно подсунуть свой context (типа D) с необходимыми методами и данными.
Вопрос, как это сделать? Копал в сторону обобщенные типов но что то у меня ни чего не получилось…

P.S. Прошу прощения, унаследовать нельзя от класса B, но его структура известна…
  • Вопрос задан
  • 4348 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
Monnoroch
@Monnoroch
Если я правильно понял задачу, то можно отнаследовать D от B, и перегрузить необходимые методы.
Ответ написан
magnitudo
@magnitudo
Архитектор, программист, предприниматель...
Используйте dynamic
Ответ написан
Комментировать
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. задумайтесь, если вам «на мгновенье» надо подсунуть «инопланетный объект» — что то не так.
НО!:
А. если это методы «компарации» — передавайте контекст как опциональный параметр к функции
Б. если у вас древовидная структура с гибкой логикой — используйте композит.

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

Войдите, чтобы написать ответ

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