Как обойтись без множественного наследования здесь

 
0
 
.NET
ava
alexplato | 28.11.2016, 05:05
Немного о предметной области

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

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

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

http://prntscr.com/dclqis

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

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

Собственно – как поступить правильно?
Ответы (1)
ava
mosquit | 29.11.2016, 13:38 (Отредактирован 29.11.2016 17:01) #
Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать некий класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions:

    Options
    ----------------
    Attributes
        +DonorOptions
        +ShopOptions
    Operations
 
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить