|
|
||||||||||||||||
.NET 4.x Классы или интерфейсы?10.06.2017, 23:28. Показов 9522. Ответов 129
Метки нет (Все метки)
Согласно новомодным книжкам от очередных гуру программистов, делаю на уровне интерфейсов.
Итак, накидаю примерчик:
Уно:
1
|
||||||||||||||||
| 10.06.2017, 23:28 | |
|
Ответы с готовыми решениями:
129
Как правильно разработать архитектуру программы (классы, интерфейсы)
Интерфейсы. Выделить у классов общий интерфейс(или интерфейсы) |
|
|
|
| 11.06.2017, 11:52 [ТС] | |
|
"свойство с признаком" - ну и зачем мне тогда вообще классы? Один "god" класс со ста свойствами и 2 мя методами)) получается.
"можно использовать AS\IS" - то есть кастование это зло?)) Добавлено через 2 минуты Можете, пожалуйста, уточнить, почему is (или без is, просто direct cast) на интерфейс - это плохо? Добавлено через 2 минуты Ну, тоесть "уно" пример это хорошо, а "дос" между плохо и иногда_надо
0
|
|
|
14783 / 9557 / 1366
Регистрация: 21.01.2016
Сообщений: 36,033
|
|||||||||
| 11.06.2017, 12:21 | |||||||||
|
Кстати, оба примера так себе. Производительнее было бы сделать так:
Добавлено через 3 минуты Ещё одно кстати: если у вас 5 разных типов за интерфейсом скрыто, и вам над всеми типами нужно сотворить работу (сделать цепочку вызовов if (a is b)), то это ещё и не производительно будет. А вот если использовать double dispatch, то определить тип алгоримта, что нужно выполнить над записью, можно будет строго в один вызов метода, что быстрее и правильнее.
0
|
|||||||||
|
14783 / 9557 / 1366
Регистрация: 21.01.2016
Сообщений: 36,033
|
||||||
| 11.06.2017, 12:39 | ||||||
|
skilllab, можно же погуглить))
Добавлено через 7 минут Вот простой пример: Кликните здесь для просмотра всего текста
1
|
||||||
|
|
|
| 11.06.2017, 13:03 [ТС] | |
|
Ясно. Нет, над всеми объектами мне не надо делать что то.
". У вас есть абстракция, которая не абстракция." класс получил свойства, которые есть в базовом интерфейсе и интерфейсе наследнике. Кастом я определяю принадлежность любого класса с базовым интерфейсом его принадлежность наследникам. Что не так? Почему вообще не уйти от интерфейса и делать классами, я вроде ранее написал.
0
|
|
|
14783 / 9557 / 1366
Регистрация: 21.01.2016
Сообщений: 36,033
|
|
| 11.06.2017, 13:05 | |
|
skilllab, я уже писал, что не так. Фиг с ним, я притомился уже объяснять. Работает и ладно.
0
|
|
|
|
|
| 11.06.2017, 15:03 | |
|
skilllab, Судя по описанию вашей задачи, вам может помочь компонентная модель (суть которой в том, что объект представляет собой контейнер, содержащий набор компонентов).
Что же касается конкретно вашего вопроса, то 1) Вариант if (rowViewModel is SpecMaterialRow ) точно неправильный, потому что смысл интерфейса полностью теряется если проверять на конкретный тип. С таким же успехом можно в методы просто object передавать без всяких интерфейсов. И тоже кастить их к SpecMaterialRow.2) Ну и если брать конкретно ваш пример, то вообще непонятно зачем там делать приведение, ведь свойство Designation доступно еще на уровне IRowViewModel. То есть приводить ничего не нужно. Возможно у вас просто неудачный пример.
1
|
|
|
|
||||||
| 11.06.2017, 16:28 | ||||||
|
skilllab, действительно, не совсем понятен сам смысл введения интерфейса, раз вам так или иначе приходится по ходу выполнения приводить его к тому или иному типу.
Я не гуру программирования, и хоть и читал про паттерны разных авторов, но думаю, что в первую очередь нужен здравый смысл. В абстракцию выводится все общее, чтобы за ней скрыть детали и работать с типом абстракции, не зна реальный тип объекта. Вот, на мой взгляд, классический пример. Тут даже две абстракции, и мы работаем на их уровне, совершенно не зная, чем они являются на самом деле и как работают внутри.
1
|
||||||
|
|
|||||||||||||||||
| 11.06.2017, 19:01 [ТС] | |||||||||||||||||
)Теперь не "в двух словах" Кликните здесь для просмотра всего текста
Есть List<SpecRowViewModel> со всеми этими классами. Лист предназначен для отображения на Datagrid WPF (там всякие конвертеры, ) Соответственно везде по коду встречается такое:
всех свойств, которые ОБЯЗАТЕЛЬНО должны быть в базовой поставке)) + ОБЯЗАТЕЛЬНО должны быть определённые, характерные для наследников. Т.е. интерфейс - это прототип. После введения интерфейса я ТОЧНО теперь знаю какие свойства где должны быть. Каждый класс ТОЧНО их реализовал. С виртуальными я периодически забывал их override-ить, и где то лепил new
Добавлено через 3 минуты Т.е. применение интерфейса не по назначению ))) а типа как в С++ (там вроде обязательно должны быть прототипы классов перед их использованием)
0
|
|||||||||||||||||
|
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
|
|
| 11.06.2017, 19:20 | |
|
skilllab, на костер его!
Шайтан!!!
0
|
|
|
|
|||||||||
| 11.06.2017, 20:13 [ТС] | |||||||||
ну может он тоже плохо понял что я ему объяснял и чего хотел добиться в самом начале пути. Хотя, вот это кастование к интерфейсу меня тож смутило. Собственно, он предлагал то что я написал в самом начале темы, но вот с каким смыслом: есть основной интерфейс IMainInterface. Есть классы, которые имплементируют этот основной интерфейс, а есть классы, в которых нужно заложить доп свойства. Так вот прототипом для этих классов был бы основной интерфейс плюс IHasMaterial к примеру, или IHasPaint Что означало бы что у некоего класса Деталь (доска) имела свойства материала или была покрашена. А вот к примеру другая Стандартная_Деталь (типа винт) имела бы материал но её НЕЛЬЗЯ было бы покрасить.Ключевое тут IHas...Добавлено через 7 минут Добавлено через 1 минуту Добавлено через 10 минут Во, нашёл тот код. Заокеанский предлагал вот это:
0
|
|||||||||
|
Master of Orion
|
||||||
| 12.06.2017, 02:15 | ||||||
|
skilllab, если у вас фиксированный набор операций, но разное поведение, это решается обычным ООП. Есть круг и квадарт, которые реализуют IEntityWithArea, понадобился треугольник: отнаследовались и реализовали этот интерфейс. ЧТобы посчитать площадь в квадрате мы просто можем написать функцию GetArea(IEntityWithArea entity) => Math.Pow(entity.Area, 2); - обычное ООП. Если у нас есть фиксированный набор объектов, но разный набор операций, например у нас есть только квадраты и треугольники, но мы хотим и площадь посчитать, и размер, и объем, и все-все-все, тогда стандартный подход - визиторы. Собсна тут про это.
И в том, и в другом случае проверка на тип через as и is выглядит странно. Почти всегда это запах и подпорки. В коде встречаются, но стремиться к ним не стоит. В последнем примере выглядит относительно адекватно, мы выбираем сущности определенного типа, хотя я бы писал что-то вроде:
1
|
||||||
|
|
||||||||
| 12.06.2017, 10:57 [ТС] | ||||||||
List<Figures> с Triangle, Circle, Square, Shape, и нужно пробежаться по листу по порядку и для каждого типа совершить получение свойства (или задание свойства) из класса (а свойство уникально для каждого класса), то и получится is и as же ![]() Добавлено через 5 минут И НАД классами я никакой работы делать не буду. А только С классами (то бишь изменять свойства конкретного класса) Добавлено через 9 минут ![]() Что typeOf() что is ... Добавлено через 6 минут И ещё чуток.
0
|
||||||||
|
14783 / 9557 / 1366
Регистрация: 21.01.2016
Сообщений: 36,033
|
|||
| 12.06.2017, 12:39 | |||
![]() А вообще, подругому никак не получалось сделать? Чтобы не бегать по коллекции и не выяснть кто есть кто?
0
|
|||
|
Master of Orion
|
|||||
| 12.06.2017, 12:42 | |||||
|
0
|
|||||
|
14783 / 9557 / 1366
Регистрация: 21.01.2016
Сообщений: 36,033
|
||
| 12.06.2017, 12:43 | ||
|
0
|
||
|
|
|||||
| 12.06.2017, 12:46 [ТС] | |||||
|
Ещё уточню: не для каждого класса VM требуется к примеру свойство "Площадь". Вон, у Line её просто не будет в модели. Хотя Line это тоже Figures. Добавлено через 1 минуту так я об этом)) и вы о том же))) я просто ищу правильный путь. Все говорят что это неправильный путь, но никто не говорит а как правильно. Визитер - погуглил, почитал. Выполнение методов над классами и в классах. Как это вяжется с назначением значения уникального для конкретного класса свойства - не понял
0
|
|||||
|
14783 / 9557 / 1366
Регистрация: 21.01.2016
Сообщений: 36,033
|
|||
| 12.06.2017, 12:53 | |||
|
0
|
|||
|
|
||||||
| 12.06.2017, 13:02 [ТС] | ||||||
|
Я, может, реально упускаю какую то фундаментальную составляющую, но вот одарю сотнями лайков за подсказку)))
пробегаясь по листу хочу изменить именно у одной Horse свойство Color. У одной, по совпадению свойства Name с ранее определённой переменной. Как? Добавлено через 5 минут Свойство Name (допустим сейчас) уникально.Добавлено через 15 секунд Свойство Name (допустим сейчас) уникально.
0
|
||||||
|
Master of Orion
|
||||||
| 12.06.2017, 13:04 | ||||||
1
|
||||||
| 12.06.2017, 13:04 | |
|
Обобщённые интерфейсы и классы Абстрактные классы и интерфейсы
Интерфейсы и абстрактные классы
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|