Как избежать использования одного и того же оператора switch в разных функциях? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть интерфейс для класса, и функции интерфейса должны вести себя по-разному в зависимости от состояния (перечисления) класса, в котором я использую функции.

public class Test : Interface
{
    Enum state = Enum.s1;
    int test = 0
    public void fn1(int x)
    {
        switch(state)
        {
            case Enum.s1:
                {
                    test += x;
                    break;
                }
            ...
        }
    }
    public void fn2(int x, ref int y)
    {
        switch (state)
        {
            case Enum.s1:
                {
                    y += x*test;
                    break;
                }
            ...
        }
    }
    public bool fn3()
    {
        switch (state)
        {
            case Enum.s1:
                {
                    return DoStuff(test);
                    break;
                }
            ...
        }

    }
}

Можно ли сделать одиночная оценка и использование ее для всех функций?

Я новичок в делегатах, но может ли это быть хорошим решением просто создать делегат для fn1 / fn2 / fn3 и заполнить их каждый раз, когда состояние изменяется с необходимым функции?

Я спрашиваю, потому что я думаю, что есть лучшее решение для этого.

Спасибо за вашу помощь:)

1 Ответ

0 голосов
/ 03 февраля 2020

У меня есть интерфейс для класса, и функции интерфейса должны вести себя по-разному в зависимости от состояния (перечисления) класса, в котором я использую функции.

Можно ли сделать единичная оценка и использование ее для всех функций?

Да и нет.

Нет , невозможно решить ее лучше с помощью структур Enum и control. Enum, введенный в switch / case, - это наименьший объем работы, который вы можете выполнить в коде.

Да , возможно сделать это лучше. То, что вы должны иметь здесь, это не 1 Реализация, которая ведет себя по-другому на Enum Value У вас должно быть 3 разных реализации для этого интерфейса все время

Различное поведение для множества функций, все ссылающиеся на одно и то же? Вот для чего существует Переопределение во время наследования!

Может быть только один нечетный случай, и это если вам необходимо изменить Перечисление / Преобразование между состояниями. Это также не является большой проблемой благодаря способности использовать один экземпляр для инициализации другого.

Посмотрите на конструкторы класса List<T> . Один из них принимает IEnumerable<T> в качестве ввода. Все коллекции generi c реализуют этот интерфейс, и даже массивы неявно объединяются в один (фактически, каждый раз, когда вы используете foreach l oop). Таким образом, они все могут использовать друг друга как инициализаторы. Он также имеет функцию ToArray() .

Я мог бы поклясться, что некоторые классы потоков могут принимать другие потоки в качестве аргумента конструктора. Простой способ обернуть потоки друг в друга. Но не могу найти его. В любом случае большинство принимают Byte[] в качестве C -торного аргумента. И все они могут быть выражены / неявно преобразованы в Byte[]. Странно, что поведение даже не определено в абстрактном базовом классе. Это просто то, что делает большинство наследников.

Редактировать: Также, если вам все еще нужно значение Enum для другого кода: свойство только для чтения. В отличие от обычных полей они могут быть добавлены в интерфейсы. И каждая реализация может возвращать разные, жестко закодированные значения.

...