Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
.NET 4.x

Классы или интерфейсы?

10.06.2017, 23:28. Показов 8546. Ответов 129
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Согласно новомодным книжкам от очередных гуру программистов, делаю на уровне интерфейсов.
Итак, накидаю примерчик:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public interface IRowViewModel : INotifyPropertyChanged
{
   ISomeItem Item {get;set;}
   string Designation { get;}
   string Name { get;}
}
 
public interface IMaterialRow : IRowViewModel
{
   double Thickness { get; }
}
 
public class SpecMaterialRow : PropertyChangedBase, IMaterialRow
{
   public ISomeItem Item { get; }
   public SpecMaterialRow(ISomeItem _item)
   {
      Item = _item;
   }
 
   public string Designation
   {
      get { return Item.Designation; }
      set { Item.Designation = value;}
   }
   
   public string Name
   {
      get { return Item.Name; }
      set { Item.Name= value;}
   }
   
   public double Thickness => Item.Thickness ;
}
Далее в коде гденить кастую и беру значение свойства.

Уно:
C#
1
2
3
4
if (rowViewModel is SpecMaterialRow )
  {
      string tempVar = ((SpecMaterialRow) rowViewModel ).Designation;
  }
Дос:
C#
1
2
3
4
if (rowViewModel is IMaterialRow  )
  {
      string tempVar = ((IMaterialRow) rowViewModel ).Designation;
  }
Вопрос: какая конструкция тогда вообще будет более корректна или верна?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.06.2017, 23:28
Ответы с готовыми решениями:

Как правильно разработать архитектуру программы (классы, интерфейсы)
Здраствуйте, минут двадцать пытаюсь сформулировать вопрос, то напишу то удалю :D, вообщем вопрос с чего начать разработку программы по...

Абстрактный класс, интерфейсы или простые классы с иерархией ?
Понять кое-что из ОПП 1-й Вопрос: Есть описание абстрактного класса abstract class HeroFactory { public abstract Movement...

Интерфейсы. Выделить у классов общий интерфейс(или интерфейсы)
Задание: У классов выделить общий интерфейс ( или интерфейсы ). первый класс : using System; using...

129
Эксперт .NET
 Аватар для Usaga
14130 / 9350 / 1350
Регистрация: 21.01.2016
Сообщений: 35,148
11.06.2017, 05:49
skilllab, эм, вообще, такое вызывает сомнения:

C#
1
if (rowViewModel is IMaterialRow  )
Это нарушение принципа "подстановки Лисков". Иногда это может быть удобно (особенно, когда нет времени или желания делать правильно), но часто - просто косяк архитектуры. Вы уверены, что такое в вашем коде необходимо?
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
11.06.2017, 07:10
Цитата Сообщение от Usaga Посмотреть сообщение
Это нарушение принципа "подстановки Лисков"
с таким подходом интерфейсы вообще запретить надо

Добавлено через 10 минут
Цитата Сообщение от skilllab Посмотреть сообщение
Вопрос: какая конструкция тогда вообще будет более корректна или верна?
смотря что надо. отличий довольно много
0
Эксперт .NET
 Аватар для Usaga
14130 / 9350 / 1350
Регистрация: 21.01.2016
Сообщений: 35,148
11.06.2017, 07:16
pycture, не совсем понял. Вы сарказмируете?))
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
11.06.2017, 09:47
Цитата Сообщение от Usaga Посмотреть сообщение
не совсем понял. Вы сарказмируете?))
нет, я делаю выводы из поста выше. в целом непонятно какое отношение баззворд в виде ППЛ имеет отношение к
C#
1
if (rowViewModel is IMaterialRow  )
0
Эксперт .NET
 Аватар для Usaga
14130 / 9350 / 1350
Регистрация: 21.01.2016
Сообщений: 35,148
11.06.2017, 09:50
pycture, не уверен, что понимаю ваш сленг)

Я хотел сказать, что, возможно, задача ТС-а решается совсем иначе. Соответственно, вопрос может не иметь смысла. Вот и всё.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
11.06.2017, 10:39  [ТС]
Да тут программист один, заокеанский, такое как-то советовал.
Только у него IMaterialRow = IHasMaterial. Т.е. типа этим as узнаём есть ли у интерфейса IRowViewModel ещё и IHasMaterial.
Ну вот меня такое кастование тоже смутило.
Цитата Сообщение от pycture Посмотреть сообщение
смотря что надо
У меня есть один базовый набор свойств, который по-любому должен обладать класс. Так же, есть 7 других наборов свойств, подходящих для разных случаев. Создаю базовый интерфйс, делаю ещё 7 с имплементацией базового. Далее работаю с коллекцией базовых List<IRowViewModel> и при необходимости (к примеру внесение изменений) узнаю as текущего и делаю касты.
Раньше всё было БЕЗ интерфейсов. Был один класс и его наследники. Но я в процессе проектирования (это не одна неделя) чот очень запутался где что есть по свойствам, методам, даже по именам методов которые забыл override-ить и написал свои такие же внутри наследников (обладающие теми же задачами, но по другому написанные) и решил привести всё к единообразию.
Кароч: as на интерфейс для последующего получения конкретных свойств класса, имплементирующего этот интерфейс - это хорошо/плохо/смотря_где?

Добавлено через 3 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
задача ТС-а решается совсем иначе
Задача именно та, которая в первом сообщении. Приведение типов наследников из базового объекта путём узнавания является ли наследник тем или иным. + использование в этом деле интерфейсов
0
Эксперт .NET
 Аватар для Usaga
14130 / 9350 / 1350
Регистрация: 21.01.2016
Сообщений: 35,148
11.06.2017, 10:50
Цитата Сообщение от skilllab Посмотреть сообщение
Кароч: as на интерфейс для последующего получения конкретных свойств класса, имплементирующего этот интерфейс - это хорошо/плохо/смотря_где?
Это где-то между "плохо" и "смотря где".

Добавлено через 2 минуты
Получается, что внешний код должен знать о классах, реализующих интерфейс, гораздо больше, чем нужно. Может быть двойную диспетчирезацию приладите (паттерн визитёр)? Так получается, что уходя от какого-то бардака вы всёравно к нему же и вернулись (насколько я понял).
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
11.06.2017, 10:51  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Это нарушение принципа "подстановки Лисков"
Не знал об "них". Но, насколько я понял, для осуществления этого принципа в базовом классе обязаны быть виртуальные методы, а в наследниках override. Только где тогда гарантия что ВСЕ методы в наследниках будут переопределены, и как быть со свойствами или методами, характерными для конкретного класса, не базового? Если же всё пихать в базовый класс, то в большинстве случаев - накой тогда производный? Так можно и штук 100 свойств в одном держать а в коде только и успевай проверять к какому именно типу относится данный класс, если в коде в принципе есть задумка на разные классы. Типа как избежать кастованя что-ли?
0
Эксперт .NET
 Аватар для Usaga
14130 / 9350 / 1350
Регистрация: 21.01.2016
Сообщений: 35,148
11.06.2017, 10:57
Можете в двух словах накидать описание вставшей перед вами задачи?

Добавлено через 4 минуты
Цитата Сообщение от skilllab Посмотреть сообщение
Но, насколько я понял, для осуществления этого принципа в базовом классе обязаны быть виртуальные методы, а в наследниках override.
Не совсем обб этом там речь. Его идея в том, что ваш класс ведёт себя строго так, как ему предписывается базовым. Т.е. внешний код не должен видеть отличий, когда работает с классом как с базовым. А в вашем случае получается, что интерфейс просто бесполезен, ибо код всё равно ЗНАЕТ с чем он реально работает. Вот я об этом. Вы ввели интерфейс, чтобы обобщить сущности, но ваш код всё равно не может работать с этими интерфейсами. Т.е. пользы от них тут нуль. Только писанина лишняя.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
11.06.2017, 11:00  [ТС]
Легко. Есть таблица в которой сейчас 5 разделов. В таблицу попадает запись, обладающая общими свойствами (а-ля Имя, Обозначение, Раздел). Запись для каждого раздела обладает своими уникальными свойствами, которые нафиг не нужны для других разделов. Так же, запись может содержать в себе список других записей из других разделов (типа как Комплект). Так же, есть разделы, которые вообще не обладают своими записями а данные для них берутся из записей других разделов (типа как есть запись Деталь из раздела Детали, а есть раздел Материал у которого запись будет браться из Детали, но так же в раздел Материал может попасть и запись Материал не привязанная к Детали).
0
Эксперт .NET
 Аватар для Usaga
14130 / 9350 / 1350
Регистрация: 21.01.2016
Сообщений: 35,148
11.06.2017, 11:00
Получается как российское законодательство: закон есть (IMaterialRow) но как его исполнять мы уже посмотрим от ситуации (as, is).
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
11.06.2017, 11:02  [ТС]
Задача такова: есть общий список, содержащий записи по таблице. В процессе нужно по полной работать с элементами списка изменяя свойства конкретных айтемов. Список нужно красиво раскидать в WPF таблице.

Задача УЖЕ решена, я лишь интересуюсь аспектами.
0
Эксперт .NET
 Аватар для Usaga
14130 / 9350 / 1350
Регистрация: 21.01.2016
Сообщений: 35,148
11.06.2017, 11:03
skilllab, что ещё за раздел? Не совсем ясно. У вас иерархия классов в таблице хранится? Речь о СУБД?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
11.06.2017, 11:04  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
но ваш код всё равно не может работать с этими интерфейсами
C#
1
SpecMaterialRow : PropertyChangedBase, IMaterialRow
Это не работа с интерфейсами?
0
Эксперт .NET
 Аватар для Usaga
14130 / 9350 / 1350
Регистрация: 21.01.2016
Сообщений: 35,148
11.06.2017, 11:04
Цитата Сообщение от skilllab Посмотреть сообщение
Задача УЖЕ решена, я лишь интересуюсь аспектами.
Ну ясно. В общем, желательно избегать таких вещей как AS и IS. Это не смертный грех ниразу, просто некоторая кривость архитектуры.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
11.06.2017, 11:06  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Не совсем ясно.
Ну дык в двух словах объяснил же))
Цитата Сообщение от Usaga Посмотреть сообщение
У вас иерархия классов в таблице хранится?
эмм...не..у меня в таблице ничего не хранится. У меня таблица - это WPF контрол для отображения списка классов, которые обладают как общими свойствами, так и уникальными.
0
Эксперт .NET
 Аватар для Usaga
14130 / 9350 / 1350
Регистрация: 21.01.2016
Сообщений: 35,148
11.06.2017, 11:07
Цитата Сообщение от skilllab Посмотреть сообщение
Это не работа с интерфейсами?
Я имею в виду не это. Интрефейсы позволяют обощить сущности, спрятать от кода реальные классы скрытые за интерфейсами. А тут получается, что коду всё равно нужно знать реальные типы. Т.е. и интерфейсы вроде есть, но и завязка на реальные типы всё равно осталась.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
11.06.2017, 11:08  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
избегать таких вещей как AS и IS
ну а как же тогда узнавать к какому именно классу принадлежит объект, если изначально работаешь с интерфейсом для этих классов?

Добавлено через 58 секунд
Цитата Сообщение от Usaga Посмотреть сообщение
спрятать от кода реальные классы скрытые за интерфейсами
Хосспади, добавить internal чтоль для класса?
0
Эксперт .NET
 Аватар для Usaga
14130 / 9350 / 1350
Регистрация: 21.01.2016
Сообщений: 35,148
11.06.2017, 11:10
skilllab, по-хорошему, это не должно требоваться. Интерфейс для того и есть, чтобы не знать, что за ним. Ну а так, если совсем припрёт, то можно использовать AS\IS или свойство с признаком (второй вариант побыстрее будет, но каст всё равно будет нужен).

Добавлено через 23 секунды
Цитата Сообщение от skilllab Посмотреть сообщение
Хосспади, добавить internal чтоль для класса?
Это вообще к чему?))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.06.2017, 11:10
Помогаю со студенческими работами здесь

Обобщённые интерфейсы и классы
Здравствуйте, прошу помочь разобраться в следующем вопросе, у меня есть обобщённый класс class Myclass&lt;T&gt; : IMy&lt;T&gt; ...

Абстрактные классы и интерфейсы
Добрый день, какой смысл в C# был заложен в создание интерфейсов, а не использование абстрактных классов. Да я знаю отличия, что в...

Полиморфные классы и интерфейсы
Создать перечисления для представления дней недели. Вывести все значения на экран.

Интерфейсы и абстрактные классы
Всем привет! Помогите пожалуйста, недавно подкинули вопрос, который заинтересовал: что было бы если разработчики Майкрософт Icomparable...

Абстрактные классы и интерфейсы. Разница
Вот хоть убейте, не могу понять разницы между абстрактным классом и интерфейсом. До этого изучал C++, там не было интерфейсов, скорее всего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru