#c_sharp #динамическая_типизация
Описан класс Volume. Volume содержит атрибут в виде объекта. Этот объект может иметь тип либо BootFAT16 либо BootFAT32 либо BootNTFS и до момента использования этого объекта, какой тип присваивать, будет ясно из условия. И в дальнейшем, в зависимости от типа объекта, он будет обрабатываться по-разному. (Интерфейс я использовать не могу т.к. много методов имеют разную сигнатуру) Как решаются такие ситуации? Какие механизмы применяют?
Ответы
Ответ 1
Думаю, что вариант со switch не очень удобный. Можно использовать словарь с делегатами. Так удобнее добавлять новые обработчики. public void ProcessBootCommon(object value) { var bootType = value.GetType(); //проверка на наличие нужного обработчика if (!BootProcessors.ContainsKey(bootType)) return; var processor = BootProcessors[bootType]; //вызов обработчика processor.Invoke(value); } private Dictionary> BootProcessors = new Dictionary > { { typeof(BootFat16), ProcessBootFat16} //и так далее для каждого типа. Легко добавлять новые обработчики, если вдруг появятся новые типы }; private void ProcessBootFat16(object value) { //Пост проверка. На всякий случай if(value.GetType() != typeof(BootFat16)) return; //Код обработки } Ответ 2
В C# все типы наследуются от базового типа object, используйте его. Ваш код будет примерно такой (C#7): void UseVolume(object volume) { switch(volume) { case BootFat16 bootFat16: BootFat16VolumeProcessor.Process(bootFat16); break; case BootFat32 bootFat32: BootFat32VolumeProcessor.Process(bootFat32); break; case BootNtfs bootNtfs: BootNtfsVolumeProcessor.Process(bootNtfs); break; default: throw new InvalidOperationException("Unknown volume type"); } }
Комментариев нет:
Отправить комментарий