У меня есть интерфейс для класса, и функции интерфейса должны вести себя по-разному в зависимости от состояния (перечисления) класса, в котором я использую функции.
Можно ли сделать единичная оценка и использование ее для всех функций?
Да и нет.
Нет , невозможно решить ее лучше с помощью структур Enum и control. Enum, введенный в switch / case, - это наименьший объем работы, который вы можете выполнить в коде.
Да , возможно сделать это лучше. То, что вы должны иметь здесь, это не 1 Реализация, которая ведет себя по-другому на Enum Value У вас должно быть 3 разных реализации для этого интерфейса все время
Различное поведение для множества функций, все ссылающиеся на одно и то же? Вот для чего существует Переопределение во время наследования!
Может быть только один нечетный случай, и это если вам необходимо изменить Перечисление / Преобразование между состояниями. Это также не является большой проблемой благодаря способности использовать один экземпляр для инициализации другого.
Посмотрите на конструкторы класса List<T>
. Один из них принимает IEnumerable<T>
в качестве ввода. Все коллекции generi c реализуют этот интерфейс, и даже массивы неявно объединяются в один (фактически, каждый раз, когда вы используете foreach l oop). Таким образом, они все могут использовать друг друга как инициализаторы. Он также имеет функцию ToArray()
.
Я мог бы поклясться, что некоторые классы потоков могут принимать другие потоки в качестве аргумента конструктора. Простой способ обернуть потоки друг в друга. Но не могу найти его. В любом случае большинство принимают Byte[]
в качестве C -торного аргумента. И все они могут быть выражены / неявно преобразованы в Byte[]
. Странно, что поведение даже не определено в абстрактном базовом классе. Это просто то, что делает большинство наследников.
Редактировать: Также, если вам все еще нужно значение Enum для другого кода: свойство только для чтения. В отличие от обычных полей они могут быть добавлены в интерфейсы. И каждая реализация может возвращать разные, жестко закодированные значения.