- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
// Не очень красивое решение. Но зато можно не выставлять в паблик всякие кишочки
private void SetValueToPrivateField<Type>(Type instance, string field, object value) {
if (instance != null) {
FieldInfo fieldInfo = typeof(Type).GetField(
field,
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
);
if (fieldInfo != null) {
fieldInfo.SetValue(instance, value);
}
}
}
Публичный сеттер нарушит инкапсуляцию, поэтому будем использовать рефлексию
"Мне нельзя ничего есть, поэтому я вставлю себе трубку прямо в живот и буду при необходимости заливать прямо туда. Но есть не буду"
Dummy00001 11.03.2015 17:46 # +9
Спасибо! Мой нынешний проект манагер хочет больше прайвитов - и прочих ОО фишек - и теперь я знаю как его идеи претворить в жизнь!
bormand 11.03.2015 20:26 # 0
А в шарпе разве нету какихнить friend'ов как в крестах или package private как в жабе? Чтобы доступ к кишочкам предоставить только ограниченному кругу близких друзей.
1024-- 11.03.2015 21:27 # 0
Я пока вижу примерно два варианта:
1. Иерархиопуть. Запилить интерфейсы YA, YB, YC, ... c a*, b*, c*, ..., унаследовать от них Y и кастовать к Y*&. Но тогда придётся платить за виртуальные функции. Хотя, нет тут нужны в виртуальных функциях, я бы на месте компилятора их выпиливал.
2. Питонопуть. Сделать a*, b*, c*, ... публичными. Написать в документации, что a* могут вызывать только A, b* - только B, c* - только C. Пирфоманс!
3. Крестопитонопуть. Сделать a*, b*, c*, ... приватными. Задрузить A, B, C и написать в документации, что что a* могут вызывать только A, b* - только B, c* - только C. Наследники A, B, C соснут.
Пример:
kegdan 11.03.2015 23:56 # 0
интерфейсы же. приводить и обращаться
2 и 3 - сатанизм чистой воды
а вообще это скорее хреновая архитектура - богообъекты нинужны
bormand 12.03.2015 00:36 # 0
kegdan 12.03.2015 03:05 # 0
+ если нужно различное поведение из схожих блоков действий - можно сделать над объеком 3 адаптера, дабы не нагружать его левыми, не нужными самому обьекту, методами
bormand 12.03.2015 06:41 # +2
Санитары, быстрее сюда! У пациента приступ ООПянки!
kegdan 12.03.2015 08:09 # 0
bormand 12.03.2015 06:45 # 0
Это можно разрулить через интерфейсы и перекастовочки, да. Но это, имхо, оверкилл. Через friend'ов (c++), package private (java) или internal (c#) получается проще и приятней.
bormand 12.03.2015 07:18 # 0
Хуёвый пример, да. Тут хватит IDBQuery для клиентов и его реализации DBQuery, которую запиливает и настраивает DBConnection...
kegdan 12.03.2015 08:36 # 0
А у 1024-- как дать разным классам разные наборы функций
1024-- 12.03.2015 14:05 # 0
С интерфейсами надо выносить и дублировать сигнатуры, платить за виртуальные методы. С друзьями нельзя передать права наследникам. Без премудростей можно случайно наплодить зависимостей.
Вот было бы что-то типа
...и зажили бы.
roman-kashitsyn 12.03.2015 14:07 # +1
bormand 12.03.2015 14:19 # 0
roman-kashitsyn 12.03.2015 14:53 # 0
roman-kashitsyn 12.03.2015 15:16 # +2
kegdan 12.03.2015 15:54 # +3
bormand 12.03.2015 15:56 # 0
Убить Бьярни?
kegdan 12.03.2015 15:59 # 0
И тогда ООП будет смолтолковское...
roman-kashitsyn 12.03.2015 15:58 # 0
kegdan 12.03.2015 16:03 # +1
Vasiliy 12.03.2015 16:30 # 0
TarasB 12.03.2015 16:35 # 0
kegdan 12.03.2015 16:56 # 0
Видимо мутировали в крестоблядей (это что за покемон?..)
(Тарас, это не про тебя, просто похоже получилось...)
Xom94ok 12.03.2015 22:50 # 0
Я недавно видел в коридоре. Спокойные, бородатые дядьки, обсуждали, как удалить rad studio.
Vasiliy 16.03.2015 15:05 # 0
kegdan 12.03.2015 16:54 # 0
roman-kashitsyn 12.03.2015 15:21 # 0
Ибо внутренние кишки я всегда могу запимплить, а приватные структуры и методы, нужные в нескольких модулях, тупо не выставлять наружу из динамической либы.
bormand 12.03.2015 14:11 # 0
Ибо нехуй. У тебя ИРЛ тоже дружба по наследству передаётся?
1024-- 12.03.2015 14:19 # 0
Говно же. Надо делать как с обычными методами. К приватным друзьям добавить публичных. Запилил я интерфейс фигни, которая мне заполняет объекты смыслом, кто-то сделал несколько реализаций - и всё. Либо дружить с реализациями, либо соснуть.
bormand 12.03.2015 14:22 # 0
Так что не вижу смысла в public friend.
1024-- 12.03.2015 14:35 # 0
Это да, душа потомков - потёмки.
Потомки друга хотят лезть в класс (по крайней мере, у меня). Скажем, если смотреть мой пример сверху, компьютер даёт абстрактной программе доступ к памяти, а какая-то конкретная программа работает и пишет.
bormand 12.03.2015 14:36 # 0
Зачем? Их предок им предоставил недостаточный интерфейс?
1024-- 12.03.2015 14:39 # 0
bormand 12.03.2015 14:41 # +1
А так ты связность повышаешь на пустом месте - у тебя хуй знает какое число потомков, написанных хуй знает кем, знает о кишках того класса. В итоге тот класс уже никогда не изменить.
1024-- 12.03.2015 14:46 # 0
kegdan 12.03.2015 15:55 # 0
1024-- 12.03.2015 18:26 # 0
kegdan 12.03.2015 18:34 # 0
Odin 03.11.2018 17:16 # 0
Больно мне нужно лезть в кишки асов.
kegdan 12.03.2015 14:16 # 0
да и кто тебе мешает писать кейсы в каждом методе?
1024-- 12.03.2015 14:24 # 0
Stallman 12.03.2015 14:28 # +2
... и ввести прототипное ООП, что бы прямо в рантайме делать:
bormand 12.03.2015 14:34 # +1
1024-- 12.03.2015 14:38 # 0
bormand 12.03.2015 14:41 # 0
wvxvw 12.03.2015 16:24 # +3
Как по мне, то лучше отдельные декларации для модулей, и там описывать что доступно снаружи.
Zuzik 12.03.2015 01:27 # 0
bormand 12.03.2015 06:40 # 0
Вот про это я и спрашивал. Спасибо.
3.14159265 12.03.2015 15:29 # 0
В жабе не надо, если число используемых! реализаций не более двух.
Думаю в других компилерах с JITом хотя бы одна реализация, но инлайнится. Но способ мудацкий и оверхедный в т.ч. по писанине.
TarasB 12.03.2015 16:02 # +1
3.14159265 12.03.2015 16:21 # 0
roman-kashitsyn 12.03.2015 16:27 # 0
Ну и пакет можно по нескольким файлам размазывать.
Lennis 11.03.2015 22:13 # 0
Или с ActiveX какогото? Я когдато для DsoFramer обьектов что-то подобное писал