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

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

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

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

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

textual
Листинг программы
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
 
namespace ConsoleApplication199
{
    class Program
    {
        static void Main(string[] args)
        {
            //
            ClassesCollection.Classes.Add(new Class1());
            //
            MyClass myClass = new MyClass();
            myClass.A();
            myClass.B();
 
            Console.ReadLine();
        }
    }
 
    interface IMyInterface
    {
        void A();
        void B();
        void C();
    }
 
    static class ClassesCollection
    {
        public static List<IMyInterface> Classes = new List<IMyInterface>();
    }
 
    class MyClass : IMyInterface
    {
        public void A()
        {
            OwnMethod();
        }
 
        public void B()
        {
            OwnMethod();
        }
 
        public void C()
        {
            OwnMethod();
        }
 
        public void OwnMethod()
        {
            var stackFrame = new StackTrace().GetFrames()[1];//получаем первый элемент стека вызова 
            var callingMethodName = stackFrame.GetMethod().Name;//получаем имя метода, котрый нас вызвал
            foreach (var cl in ClassesCollection.Classes)
                cl.GetType().GetMethod(callingMethodName).Invoke(cl, null);//вызываем этот метод у всех элементов коллекции
        }
    }
 
    class Class1 : IMyInterface
    {
        public void A()
        {
            Console.WriteLine("Hi from Class1.A()");
        }
 
        public void B()
        {
            Console.WriteLine("Hi from Class1.B()");
        }
 
        public void C()
        {
            Console.WriteLine("Hi from Class1.C()");
        }
    }
}

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


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

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

13   голосов , оценка 4.154 из 5
Похожие ответы