|
|
|||||||||||
.NET 4.x Как получить свойство класса?13.06.2017, 22:23. Показов 7156. Ответов 101
Метки нет (Все метки)
В продолжении темы визитора
Есть, к примеру, вот такой код:
0
|
|||||||||||
| 13.06.2017, 22:23 | |
|
Ответы с готовыми решениями:
101
Как поместить свойство класса типа Enum в конструктор Можно ли как-то получить из одного класса исходный код другого класса? |
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
||||||
| 15.06.2017, 10:03 | ||||||
|
skilllab, тег:
Так, что тут или визитёр или IS-ы. Я когда проект просил имел в виду другое: может в вашем проекте можно обойтись без формирование общей коллекции классов одной иерархии. Тогда данная мутная тема стала бы неактуальной. Просто в такой подаче, как в примере выше иначе никак не поступить (если у нас такая коллекция существует обоснованно и никуда от неё не деться). Есть ещё возможный вариант: свойства объектов хранить в коллекции (List<KeyValuePair> или Dictionary) в каждом объекте, тогда можно будет искать объекты по тегам (максимум производительности), но вообще ничего не кастить - коллекция будет описана в базовом классе. Это нечто похожее на PHP, но если свойства преимущественно мёртвым грузом лежат (не используются в бизнес-логике или контролы к ним руки свои грязные не тянут), то такое проканает.
0
|
||||||
|
|
|||||||||||||
| 15.06.2017, 10:26 | |||||||||||||
И кстати, зачем вы оверрайдите все эти свойства - ID, Name? Usaga, Насколько я понимаю, у автора набор примитивов, каждый с каким-то набором свойств. Эти наборы не являются классами в полном смысле слова. Они классы постольку-поскольку. Фактически автор работает не с объектами а с данными. Отсюда тяга к рефлекшену и работе с полями по имени, а не с объектами.
0
|
|||||||||||||
|
|
|||
| 15.06.2017, 11:00 [ТС] | |||
|
В целом: Есть сторонняя программа. В ней происходит формирование сущности, работа со свойствами сущности. Изначально эта сущность с кучей свойств, универсальная. GOD класс, если перефразировать. Именно в таком виде с сущностью удобно работать в той программе. Сущность та хранится прям внутри отдельного рабочего файла той программы: т.е. сериализуется в бинар и запихивается внутрь некоего "хранилища" в физическом файле. Это 3rdParty для той программы. Т.е. файл той программы позволяет хранить данные НЕ программы, а вообще сторонние. Это нужно для того, чтобы таская файл по компам или по миру)) данные всегда были при файле. Далее, с помощью уже моей программы, та сущность преобразовывается в набор классов => сущности с которыми удобно работать уже в моей программе. Если изначально была одна универсальная, то теперь она логически представляет из себя именно то, что должна. Там она имела просто enum-ы, характеризующие сущность в целом, то теперь стала полноценным объектом. В котором часть свойств перекочевала как есть, а часть преобразовалась в новую сущность. Так вот, исходя из тех enum-ов e у меня может быть строго определённое количество моих сущностей со своим набором уникальных свойств и поведения. Добавление новой - это не просто дописать класс, это прям нужно реально апгрейдиться. Тут на помощь приходит ГОСТ ))) у него строго регламентировано количество этих сущностей, у меня они все есть но не все используются)) кароч NotImplemented. Так вот с этим своим набором сущностей я и работаю уже у себя в программе. Если говорить предметно уже, то: В той программе - есть деталь и сборочная единица (и то и то это физические файлы). Сборочная единица содержит в себе коллекцию деталей, либо может быть пустой, но при этом остаётся сборочной единицей. И деталь и сборочная единица обладают набором свойств - тот самый GOD класс. Свойства к примеру: Обозначение, наименование, Материал, Покраска, Фамилии разработчиков и утверждающих. В моей программе - деталь превращается в Деталь, её материал в Материал, т.е. у Материала Обозначение и Наименование - это свойства из Детали, но Материал теперь - это самостоятельная единица ибо Материал может быть и БЕЗ Детали. Или даже так может быть: Материал может быть получен из Детали, а благодаря манипуляциям пользователя Материал стал БЕЗ привязки к Детали, т.е. стал "виртуальной единицей" чисто у меня в программе. Дальше хуже))) у детали, как файла, может быть enum = Material. Это значит что GOD сущность преобразовывается прям сразу в Материал. У Материала, к примеру НЕ МОЖЕТ быть свойств фамилий разработчиков или свойства материал)). Так что поведение класса Материал очень отличается от поведения класса Деталь или Сборка. Естественно по ходу работы в программе пользователь может изменять что угодно и как угодно. И даже больше ))) всю логику не описать - там ТЗ целое. Так что набор разношёрстных классов оправдан. И, кстати, путём обратного преобразования свойства из моих классов могут перекочёвывать в GOD класс обратно, нечто похожее на маппинг. Ибо как писал выше - GOD класс это именно то что нужно для работы ВНЕ моей программы, для работы в той программе. Это всё уже мои сущности. Сама моя программа - это с виду DataGrid, разделённый на Разделы: ДокументацияКоллекция для этой DataGrid - это набор разношёрстных классов ViewModel, представляющих мои сущности. Каждая моя сущность обладает своим поведением и своим набором свойств. В DataGrid всё более унифицированно для отображения. Т.е. у Детали ячейка Обозначение Материала берётся как свойство в VM "Деталь.Материал.Обозначение", у Материала Обозначение берётся как "Материал.Обозначение". Это как-то так...вкратце ))) Так вот пробегаясь по коллекции из этих ViewModel-ей, мне нужно знать с какой именно ViewModel-ю я работаю, и в зависимости от этого уже устанавливать или брать значение для бизнес-логики. Нельзя установить свойство Разработал классу Материал ))) ибо материал тупо не обладает таким свойством в отличие от Детали. Добавлено через 58 секунд покопаюсь.
0
|
|||
|
|
||
| 15.06.2017, 11:20 | ||
|
Проблема то в чем? Что вы такое пытаетесь с этим делать, что у вас появляются все эти монструозные as/is, визиторы и т.д.? В чем суть проблемы? (только не говорите что суть проблемы в касте, опишите проблемы более широко, каст - это способ решения а не проблема) Да, и пример кратенький этого god объекта и декомпозиции желательно привести.
0
|
||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
||
| 15.06.2017, 11:43 | ||
![]() Добавлено через 3 минуты Storm23, вообще, мне изначально не понравилась задумка разделять данные на отдельные классы, чтобы потом всё равно выяснять кто где, потому я и зацепился.
0
|
||
|
|
|||||
| 15.06.2017, 11:56 [ТС] | |||||
|
Карандаш обладает твёрдостью, фломастер содержанием спирта. Так и у меня: если всё содержимое вывалить на стол и сгруппировать, то к каждому субъекту рисования нужно применить правило получения или задания его свойства. Тут и возникает каст. Ну не обладает карандаш спиртосодержанием)) И помещение в класс Карандаша этого свойства, хоть null хоть empty - просто нелогично. С самим GOD классом напрямую тоже низя работать. Иначе там количество флагов и enum-ов может перевалить за десяток. Это я говорю уже с высоты переделки модели по некоему ТЗ (а как известно ТЗ и реальность это бывает оторванные друг от друга вещи) раз 5. Добавлено через 1 минуту
0
|
|||||
|
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
|
|
| 15.06.2017, 13:22 | |
|
Поправьте, если я не прав...
У ТСа проблема в том, что у него изначально неправильная архитектура модели данных, реализующая антипаттерн "Божественная сущность". А всё остальное - костыле-ориентированное программирование с попыткой разрулить кривую модель в жёстко структурированную логику.
0
|
|
|
|
|||
| 15.06.2017, 14:40 [ТС] | |||
|
aquaMakc, не прав.
Забудьте о существовании GOD класса )) он служит лишь для получения данных. Представьте его просто как поставщика огромной кучи данных, которые нужно обработать. Я привёл его для понимания модели. Добавлено через 58 минут И всё - отстану.
0
|
|||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
||
| 16.06.2017, 04:31 | ||
|
GOD-класс, который получается из стороннего приложения создан таким только для удобства (если клея унюхаться) хранения. По своей сути, все выделенные из него классы не имею между собой ничего общего. У них тупо нет и не может быть общего предка, это совершенно разные сущности. Может иметь место агрегация или композиция, но уж точно не наследование. "Деталь" содержит ссылку на "Материал", но это не делает их родственными классами. "Сборка" может содержать ссылку на список деталей, но это опять же композиция. А вы пытаетесь увидеть в них что-то общее. Вот вам и корень проблемы. Именно это я и предполагал в самом своём первом ответе на ваш вопрос в прошлой теме. Все эти классы были свалены в кучу не потому, что они про одно. Нет. Просто кто-то решил, что ему так удобнее хранить данные. Всё в одной свалке. skilllab, вы имеете дело с разными классами. Им не место в одной коллекции. Нужно пересмотреть их взаимоотношения исходя из ТЗ и предметной области. Вполне может статься, что тут имеет место чистый агрегат включающий все классы. Тогда никаких визитёров, рефлексий и IS\AS. Коллекция будет хранить только один кореневой класс (корень агрегации, агрегат - терминов много), а все эти сущности будут доступны через типизированные свойства или методы.
1
|
||
|
|
|
| 16.06.2017, 07:00 [ТС] | |
|
Строчил строчил сообщение)) а потом метро ушло под землю во время отправки.
Короче, тут уже вступает "не надо слов, покажите мне код". но его весь не могу. А часть, или "упрощённо", на первой странице, внизу. Скажем так: в данной теме я разбираюсь с визитером.
0
|
|
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
|
| 16.06.2017, 07:02 | |
|
skilllab, тут уже не нужен код. Судя по вашему более детальному описанию, иерархии классов тут просто нет. У вас или композиция должна быть, или отдельные коллекции под отдельные классы. Никакой визитёр тут уже не уместен.
0
|
|
|
|
|
| 16.06.2017, 07:05 [ТС] | |
|
Пысы: god класс ни при чём. Вообще. Зря вы за него цепляетесь, хотя я даже блин просил этого не делать. После старта моей программы у меня вообще нет god классов в коде))
Добавлено через 2 минуты Композиция есть. Охх. Просто помогите пожалуйста с визитером на примере того класса, который я по вашей просьбе, накидал. Спасибо.
0
|
|
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
|
| 16.06.2017, 07:12 | |
|
skilllab, GOD класс тут действительно не причём. Сами подумайте, каким боком должны быть связаны "Деталь", "Материал" и "Документация". С моей точки зрения: никак. То, что у них пару свойств совпадает родственности им не добавляет. Это просто разные классы и всё.
Добавлено через 3 минуты Я же вам уже "накидывал" пример. Тоже с животными было.
0
|
|
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
||
| 16.06.2017, 07:15 | ||
|
Добавлено через 17 секунд Для чего они были в один список положены? Добавлено через 34 секунды Мы близки к по настоящему правильному решению вашей задачи.
0
|
||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
|
| 16.06.2017, 07:20 | |
|
skilllab, почему он вам ничего не дал? Вы не поняли, как в методах визитёра разместить логику работы с объектами?
0
|
|
|
|
|||||
| 16.06.2017, 08:02 [ТС] | |||||
назовём его ISpecItem.Тут дальше загвоздка может быть в том, что я для каждого своего класса использую разные ViewModel (мне нужна обертка прям обязок) Добавлено через 10 минут Но если бы была одна ViewModel, тогда б она стала GOD классом в штук over500 строк кода да и с null значениями. Ибо, как писал ранее, у классов Material, Paint, Documentation .. просто нет свойства SignedPeople (свойство-класс), которое есть у класса Part. Оно уникально только для Part. И это приведено в пример только одно! свойство ![]() Добавлено через 8 минут Storm23, показал КАК можно вытащить свойство. Psilon намекнул КАК можно установить одно свойство передав параметр. У вас же я спрашиваю ваше видение визитера, на что вы меня отсылаете опять к своему ультра_супер_утрированному примеру где визитёр что-то там (какие то методы) вызывает внутри классов. Добавлено через 4 минуты А я никак...Добавлено через 4 минуты
0
|
|||||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
||
| 16.06.2017, 08:26 | ||
|
Насколько я понял, у вас вообще разные классы. 15 общих свойств вы завели тупо для того, чтобы отображать всё это в одном DataGrid? Это так? Я не показывал более конкретный пример потому, что не мог от вас добиться конкретики. Установка или чтение свойства - это часть некоторой логики, вы мне её не показывали\не описывали. Я настаивал на том, что нужно в визитёр выносить не чтение\установку свойства, а всю логику, в которой данное действие происходит. Чуете разницу?
0
|
||
|
|
|||||||
| 16.06.2017, 08:28 [ТС] | |||||||
0
|
|||||||
| 16.06.2017, 08:28 | |
|
Свойство класса возвращает объект другого класса
Как получить ссылку на метод класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|