Вот бы множественное наследование в C#???

Немного о предметной области

Есть базовый класс DonorOptions. Буквально опции донора (источника данных).

Теперь переметнемся сразу в текущую реализацию. ExcelShopFileDonorOptions – это опции для получения данных из файла Excel. При этом, что очень важно, это класс для получения данных, которые актуальны для интернет магазина (собственно все выше сказанное отражено в названии класса).

Также стоит заметить, что свойства ExcelShopFileDonorOptions можно разделить на 2 категории. Свойства, связанные с файлом (например FilePath – путь к файлу), а также свойства связанные с тем, что данные актуальны для интернет магазина (например Currency – валюта). Мы понимаем, что и те, и другие свойства могут использоваться в других реализациях. По такому же принципу, например можно создать класс CSVShopFileDonorOptions. Соответственно свойства определены в базовых классах, от которых можно наследовать другие реализации. Это отобразил в UML:

multiple-inheritance

Однако представим ситуацию, когда нам нужно создать реализацию класса опций для данных, актуальных для магазина, но есть одно НО. Данные берутся не из файла, а например из базы данных? Получается класс ShopFileDonorOptions мы уже использовать не сможем. Причина – в нем будут избыточные свойства (например FilePath), которые нам нафиг не нужны. Соотвественно придется определять новый базовый класс, в котором будет свойство Currency, но которые не будет наследоваться от FileDonorOptions.

Напрашивается жгучее желание, использовать здесь “множественное наследование” , которое запрещено в C#. Соответственно, не вариант (насколько я понимаю). С другой стороны можно использовать интерфейсы (контракты по сути). Однако тут не удобно то, что нам в производных классах придется придется переопределять свойства интерфейсов. Как результат – дублирование кода.

Собственно – как поступить правильно?