Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .NET и C# > Как обойтись без множественного наследования здесь |
Автор: alexplato 28.11.2016, 05:05 |
Немного о предметной области Есть базовый класс DonorOptions. Буквально опции донора (источника данных). Теперь переметнемся сразу в текущую реализацию. ExcelShopFileDonorOptions – это опции для получения данных из файла Excel. При этом, что очень важно, это класс для получения данных, которые актуальны для интернет магазина (собственно все выше сказанное отражено в названии класса). Также стоит заметить, что свойства ExcelShopFileDonorOptions можно разделить на 2 категории. Свойства, связанные с файлом (например FilePath – путь к файлу), а также свойства связанные с тем, что данные актуальны для интернет магазина (например Currency – валюта). Мы понимаем, что и те, и другие свойства могут использоваться в других реализациях. По такому же принципу, например можно создать класс CSVShopFileDonorOptions. Соответственно свойства определены в базовых классах, от которых можно наследовать другие реализации. Это отобразил в UML: http://prntscr.com/dclqis Однако представим ситуацию, когда нам нужно создать реализацию класса опций для данных, актуальных для магазина, но есть одно НО. Данные берутся не из файла, а например из базы данных? Получается класс ShopFileDonorOptions мы уже использовать не сможем. Причина – в нем будут избыточные свойства (например FilePath), которые нам нафиг не нужны. Соотвественно придется определять новый базовый класс, в котором будет свойство Currency, но которые не будет наследоваться от FileDonorOptions. Напрашивается жгучее желание, использовать здесь “множественное наследование” , которое запрещено в C#. Соответственно, не вариант (насколько я понимаю). С другой стороны можно использовать интерфейсы (контракты по сути). Однако тут не удобно то, что нам в производных классах придется придется переопределять свойства интерфейсов. Как результат – дублирование кода. Собственно – как поступить правильно? |
Автор: mosquit 29.11.2016, 13:38 |
Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать абстрактный класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions: Options ---------------- Attributes +DonorOptions +ShopOptions Operations Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-oboytis-bez-mnozhestvennogo-nasledovaniya-zdes-id583b9157b4c92c529a1f92d2#findElement_E7045_583d5ab20ef42f4ab71ff6fc_0 |
Автор: mosquit 29.11.2016, 13:38 |
Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать абстрактный класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions: Options ---------------- Attributes +DonorOptions +ShopOptions Operations Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-oboytis-bez-mnozhestvennogo-nasledovaniya-zdes-id583b9157b4c92c529a1f92d2#findElement_E7045_583d5ab20ef42f4ab71ff6fc_0 |
Автор: mosquit 29.11.2016, 13:38 |
Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать абстрактный класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions: Options ---------------- Attributes +DonorOptions +ShopOptions Operations Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-oboytis-bez-mnozhestvennogo-nasledovaniya-zdes-id583b9157b4c92c529a1f92d2#findElement_E7045_583d5ab20ef42f4ab71ff6fc_0 |
Автор: mosquit 29.11.2016, 13:38 |
Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать абстрактный класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions: Options ---------------- Attributes +DonorOptions +ShopOptions Operations Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-oboytis-bez-mnozhestvennogo-nasledovaniya-zdes-id583b9157b4c92c529a1f92d2#findElement_E7045_583d5ab20ef42f4ab71ff6fc_0 |
Автор: mosquit 29.11.2016, 13:38 |
Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать абстрактный класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions: Options ---------------- Attributes +DonorOptions +ShopOptions Operations Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-oboytis-bez-mnozhestvennogo-nasledovaniya-zdes-id583b9157b4c92c529a1f92d2#findElement_E7045_583d5ab20ef42f4ab71ff6fc_0 |