Morpheus_God
@Morpheus_God

Как вызвать конкретный метод реализованного класса?

Добрый день. Помогите разобраться с задачкой.
Есть интерфейс.
ICommand

public interface ICommand
    {
        void Start();
        void Close();
    }


Есть его условные реализации:
Реализации

public class Winamp : ICommand
    {
        public void Close()
        {
            Console.WriteLine("Winamp closed");
        }

        public void Start()
        {
            Console.WriteLine("Winamp started");
        }
    }

    public class KmPlayer : ICommand
    {
        public void Close()
        {
            Console.WriteLine("KmPlayer closed");
        }

        public void Start()
        {
            Console.WriteLine("KmPlayer started");
        }
    }

    public class Steam : ICommand
    {
        public void Close()
        {
            Console.WriteLine("Steam closed");
        }

        public void Start()
        {
            Console.WriteLine("Steam started");
        }
    }


Есть вроде бы как контейнер который хранит пару ключ-значение.
Словарь

private static Dictionary<string, ICommand> CreateCommands()
        {
            var commands = new Dictionary<string, ICommand>();
            commands.Add("Winamp", new Winamp());
            commands.Add("Steam", new Steam());
            commands.Add("Player", new KmPlayer());
            return commands;
        }


Проблема в том, что если я пытаюсь перебрать словарь по значению, то программа вызывает сразу все мне реализации методов в классе.
Как сделать так, что бы вызывался конкретный метод нужного класса?
Я понимаю, что проблема вероятно в цикле, поскольку там не указано, какой класс конкретно вызывать при вводе команды.
Но додуматься не получается пока что, как сделать.
Обработка ввода

static void Main(string[] args)
        {
            var d = CreateCommands();
           
            Console.WriteLine("???");
            string k = Console.ReadLine();

            foreach (var item in d)
            {
                switch (item.Key)
                {
                    case "Winamp":
                        item.Value.Start();
                        break;

                    case "Steam":
                        item.Value.Start();
                        break;
                }

            }
            
            Console.ReadKey();
        }

  • Вопрос задан
  • 86 просмотров
Решения вопроса 2
GavriKos
@GavriKos
Проблема именно в цикле. Непонятно вообще зачем он нужен - из словаря доставать по ключу можно просто через []. А так - перебрали все, для каждого вызвали, то что считали с консоли - нигде не использовали )
Ответ написан
freeExec
@freeExec
Участник OpenStreetMap
Твой код можно исправить так:
foreach (var item in d)
{
    if (item.Key != k)
        continue;

    switch (item.Key)


Но я бы написал проще
if (d.ContainsKey(k))
    d[k].Start();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы