Головоломка с архитектурой приложения - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Для начала опишу вкратце ситуацию. Допустим есть следующий интерфейс
Листинг программы
  1. interface IMyInterface
  2. {
  3. void A();
  4. void B();
  5. void C();
  6. }
Есть несколько классов, которые реализуют этот интерфейс. Для примера рассмотрим класс который реализует это интерфейс и + имеет свой собственный метод OwnMethod(). Каждый из методов (А,В,С) вызывает OwnMethod со своими параметрами
Листинг программы
  1. public class MyClass
  2. {
  3. public void A()
  4. {
  5. //OwnMethod(параметры 1)
  6. }
  7. public void B()
  8. {
  9. //OwnMethod(параметры 2)
  10. }
  11. public void C()
  12. {
  13. //OwnMethod(параметры 3)
  14. }
  15. public void OwnMethod()
  16. {
  17. //Method
  18. }
  19. }
Также есть набор классов реализующих этот интерфейс, но без дополнительных методов: Class1, Class2, Class3... Внимание вопрос: реально ли вообще сделать какое нибудь действие во время вызова OwnMethod, чтобы внутри него без лишних телодвижений сделать следующее, например: если я вызвал OwnMethod внутри MyClass.A(),то чтобы внутри OwnMethod можно было вызвать A() для всех классов которые реализуют этот интерфейс (классы собраны в колекцию) Может немного неясно пояснил, извините расписал как смог. Мои идеи: 1) При условии что А, В и С имеют одинаковую сигнатуру,описать делегат, в OwnMethod в параметрах объявить переменное число параметров этого делегата , и в вызове MyClass.A()/MyClass.В()/MyClass.С() в параметры OwnMethod передавать конкретные объекты с их параметрами. (Мне этот вариант нравится больше всего) 2) Расширить классы методами ExecuteOperation() - метод который принимает строку с именем метода, и switcом выбирает необходимый метод на выполнения (по моему это очень тупорыло). Может у кого есть собственный взгляд на этот вопрос. Буду рад услышать чье то мнение. Спасибо.

Решение задачи: «Головоломка с архитектурой приложения»

textual
Листинг программы
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Threading;
  6.  
  7. namespace ConsoleApplication199
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             //
  14.             ClassesCollection.Classes.Add(new Class1());
  15.             //
  16.             MyClass myClass = new MyClass();
  17.             myClass.A();
  18.             myClass.B();
  19.  
  20.             Console.ReadLine();
  21.         }
  22.     }
  23.  
  24.     interface IMyInterface
  25.     {
  26.         void A();
  27.         void B();
  28.         void C();
  29.     }
  30.  
  31.     static class ClassesCollection
  32.     {
  33.         public static List<IMyInterface> Classes = new List<IMyInterface>();
  34.     }
  35.  
  36.     class MyClass : IMyInterface
  37.     {
  38.         public void A()
  39.         {
  40.             OwnMethod();
  41.         }
  42.  
  43.         public void B()
  44.         {
  45.             OwnMethod();
  46.         }
  47.  
  48.         public void C()
  49.         {
  50.             OwnMethod();
  51.         }
  52.  
  53.         public void OwnMethod()
  54.         {
  55.             var stackFrame = new StackTrace().GetFrames()[1];//получаем первый элемент стека вызова
  56.             var callingMethodName = stackFrame.GetMethod().Name;//получаем имя метода, котрый нас вызвал
  57.             foreach (var cl in ClassesCollection.Classes)
  58.                 cl.GetType().GetMethod(callingMethodName).Invoke(cl, null);//вызываем этот метод у всех элементов коллекции
  59.         }
  60.     }
  61.  
  62.     class Class1 : IMyInterface
  63.     {
  64.         public void A()
  65.         {
  66.             Console.WriteLine("Hi from Class1.A()");
  67.         }
  68.  
  69.         public void B()
  70.         {
  71.             Console.WriteLine("Hi from Class1.B()");
  72.         }
  73.  
  74.         public void C()
  75.         {
  76.             Console.WriteLine("Hi from Class1.C()");
  77.         }
  78.     }
  79. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы