Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обойтись без множественного наследования здесь, Разные категории базовых свойств 
:(
    Опции темы
alexplato
Дата 28.11.2016, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 14.11.2010

Репутация: нет
Всего: нет



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

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

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

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

http://prntscr.com/dclqis

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

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

Собственно – как поступить правильно?
PM MAIL   Вверх
mosquit
Дата 29.11.2016, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 7.2.2009

Репутация: нет
Всего: нет



Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать абстрактный класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions:

    Options
    ----------------
    Attributes
        +DonorOptions
        +ShopOptions
    Operations


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
mosquit
Дата 29.11.2016, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 7.2.2009

Репутация: нет
Всего: нет



Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать абстрактный класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions:

    Options
    ----------------
    Attributes
        +DonorOptions
        +ShopOptions
    Operations


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
mosquit
Дата 29.11.2016, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 7.2.2009

Репутация: нет
Всего: нет



Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать абстрактный класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions:

    Options
    ----------------
    Attributes
        +DonorOptions
        +ShopOptions
    Operations


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
mosquit
Дата 29.11.2016, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 7.2.2009

Репутация: нет
Всего: нет



Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать абстрактный класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions:

    Options
    ----------------
    Attributes
        +DonorOptions
        +ShopOptions
    Operations


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
mosquit
Дата 29.11.2016, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 7.2.2009

Репутация: нет
Всего: нет



Здесь нужно воспользоваться не наследованием, а вложенными классами. Т.е. создать абстрактный класс (допустим, Options), в который в качестве свойств войдут классы DonorOptions и ShopOptions:

    Options
    ----------------
    Attributes
        +DonorOptions
        +ShopOptions
    Operations


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1186 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.