|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Есть такой код Код: 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. 35. 36. 37.
Т.е. базовый класс и от него наследуются, в дочерних перепрописываются виртуальные методы. Если в дочернем метод не перепрописан, то не надо делать ряд действий в базовом классе. Как-то можно в базовом это определить? Неважно во время компиляции или во время выполнения. Суть в том базовый класс используется во многих проектах и сейчас просто приходится выставлять флаг что он прописан. Хочется избавиться от флага. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 15:35 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima T, интернеты говорят можно так попробовать... Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 16:08 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
наверное можно как-то так, но имхо это изврат какой-то. базовый класс не должен знать про своих наследников ничего Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 16:25 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Мне не показалось что виртуальный метод из конструктора зовётся? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 16:32 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Изопропил, где? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 16:39 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
buser, спасибо, работает. Исходник Код: 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. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
winsky!наверное можно как-то так, но имхо это изврат какой-то. базовый класс не должен знать про своих наследников ничего Изврат, но так удобнее чем кучу классов городить. Базовый готовит несколько типов данных и вызывает методы дочерних для обработки. Если какой-то метод не прописан, то значит в данном случае оно не надо и подготовку можно не делать. Проверять прописан ли метод запуском самого метода не вариант, т.к. сначала надо данные для его вызова приготовить, а после уже поздно проверять. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 17:10 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 17:46 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima T, я обычно интерфейсы для этого к классам добавляю, методы все же обычно не просто так к классу привязаны. Типа метод есть - так почему бы его не вызвать? ))) Ввести интерфейс IMyMethodSupportable, а сам метод сделать приватным - его даже вызвать не получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 18:02 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
ООП и реальность иногда расходятся. У меня задача закодить пару сотен проектов с минимумом напряга. Проект это написать 1-2 виртуальных метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 20:55 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima T, Тогда сделай без напряга метод virtual bool IsMethodAOverloaded() {return false;} И вместе с методом A переопределяй его тоже. Просто, надёжно, быстро и компактно. Твой метод с рефлекшн это вычурно overingenering. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2017, 00:42 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
mikronDima T, Тогда сделай без напряга метод virtual bool IsMethodAOverloaded() {return false;} И вместе с методом A переопределяй его тоже. Просто, надёжно, быстро и компактно. Твой метод с рефлекшн это вычурно overingenering. Dima Tсейчас просто приходится выставлять флаг что он прописан. Хочется избавиться от флага.Круг замкнулся ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2017, 13:37 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
mikronDima T, Тогда сделай без напряга метод virtual bool IsMethodAOverloaded() {return false;} И вместе с методом A переопределяй его тоже. Просто, надёжно, быстро и компактно. Твой метод с рефлекшн это вычурно overingenering. Какая разница: метод сделать или флаг, все равно писать это надо. А тут на автомате все само работает. Можно по фэншую через делегаты (Action) сделать, но так тоже букав больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2017, 16:04 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima T Есть такой код Код: 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. 35. 36. 37.
Т.е. базовый класс и от него наследуются, в дочерних перепрописываются виртуальные методы. Если в дочернем метод не перепрописан, то не надо делать ряд действий в базовом классе. Как-то можно в базовом это определить? Неважно во время компиляции или во время выполнения. Суть в том базовый класс используется во многих проектах и сейчас просто приходится выставлять флаг что он прописан. Хочется избавиться от флага. Ответ кроется в самом вопросе. Нужно вынести вызов методов базового класса в переписанные методы дочернего класса (равносильно затратам на убирание флагов). Например: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 14:50 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Ну и чтобы в связанных проектах ничего не поломалось - текущий флаг пометьте Obsolete с ошибкой компиляции, чтобы при следующей перекомпиляции связанных проектов не забыли об этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 14:55 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
LameUser, ты красным суть выделил, но похоже ее не понял. Мне надо ДО вызова метода знать что он не прописан. Базовый класс выглядел так (схематично) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Т.е. сначала все качалось и парсилось чтобы в итоге выяснить что сохранять нечем. Сейчас стало так Код: c# 1. 2. 3. 4. 5. 6.
Т.е. не прописан метод, значит не качаем и не парсим. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 15:36 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima T, Течнически проблема решена, и если тя всё устраивает то тема закрыта. ИМЧО Архитектура кривая. Опиши поведение метода "поработать" в документации к нему и я думаю станет очевидно что сним не так: его поведение больше не опредлеяется состоянием обьекта. Помимо того что это не очевидно: Представь ситуацию где Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Уже не работает по причине что для Intermediate идее автора не должен работать "Поработат". Практически ты требуеш следующий увовень наследования должен быть последним и завершённым. Может тебе просто надо обявить "Сохранить" абстрактным? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 17:17 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TООП и реальность иногда расходятся. У меня задача закодить пару сотен проектов с минимумом напряга. Проект это написать 1-2 виртуальных метода. Это не ООП и реальность расходятся, это некорректные ожидания не сходятся с реальностью. Тут требуется декомпозиция класса. Возможно всё можно свести к красивой реализации на Visitor. Суть правильно спроектированого класса по канонам ООП это как раз не знать в базовом классе, переопределён метод или нет. Иначе будет нарушен принцип Лисков. А если это по каким-то причинам потребовалось, тебе приходится тулить какие-то флаги, значит ты совершенно, абсолютно точно что-то делаешь неправильно, и костыли вряд ли помогут на перспективу. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 19:24 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TТ.е. не прописан метод, значит не качаем и не парсим. Почему бы не делегировать принятие этого решения? В общем, до самой жути, как криво. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 19:25 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttСуть правильно спроектированого класса по канонам ООП это ... ... это соответствие канонам ООП. На ООП жизнь не заканчивается, я уже написал. Есть конечная задача, еще раз конечная , и мне не надо ее раздувать до вселенской масштабируемости, максимальной повторной используемости кода и т.д. в соответствии с канонами ООП. Мне надо ее решить минимальным количеством букав в дочерних классах, чтобы максимально облегчить жизнь тому кто будет эти 2-3 метода прописывать сотню раз. PS Задача уже успешно решена похожим образом на другом ЯП, сейчас просто переходим на C#. Мне не надо запаса прочности типа "завтра что-то потребуется а оно не впишется в твою архитектуру", соблюдение теории именно этот запас прочности создает. Что-то усложнять только ради соблюдения теории просто не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 20:00 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
mikronТечнически проблема решена, и если тя всё устраивает то тема закрыта. Технически решена, но вдруг я что-то не знаю и мне дадут лучшее решение. Бывает и такое, я себя самым умным не считаю, поэтому тему не надо закрывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 20:12 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TLameUser, ты красным суть выделил, но похоже ее не понял. Мне надо ДО вызова метода знать что он не прописан. Базовый класс выглядел так (схематично) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Т.е. сначала все качалось и парсилось чтобы в итоге выяснить что сохранять нечем. Сейчас стало так Код: c# 1. 2. 3. 4. 5. 6.
Т.е. не прописан метод, значит не качаем и не парсим. Суть то я понял - неправильная архитектура. Я предложил решение, которое бы решило твою проблему более менее правильно (не знаю всей структуры твоего проекта). Но так как тебе не нужно правильное решение, а быстрое - вопрос снимается. Либо ты возможно не видишь как можно применить мое предложенное решение (принцип простой - если что-то не должно запускаться, надо не костыли делать, а просто не запускать). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 10:55 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TЕсть конечная задача, еще раз конечная Судя по твоей же задаче, переопределение метода Сохранить вовсе не означает, что непосредственно сохранение реализовано. Кроме того, как это тестировать? В общем, "решение" своей задачи ты и сам прекрасно знал ещё до того, как создал тему. Определить, что метод переопределён в дочернем классе, задачка вполне себе студенческая. Но утверждения типа "ООП и реальность не сходится", это попытка оправдать неудачу при попытке забить гвоздь кулаком. Вот с этим не согласен. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 18:26 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVostt В общем, "решение" своей задачи ты и сам прекрасно знал ещё до того, как создал тему. У тебя хрустальный шар запылился, протри, я не студент, C#/.Net по немногу изучаю (это вторая серьезная поделка), в книгах внимание заостряю на том что мне реально нужно, знаю что есть рефлексия, но мне не до нее, просто пролистал эту тему в книгах. Интуитивно было понятно что она может помочь в данном случае - вот и спросил и ответили. То что рефлексией пользуются все сереализаторы это фэншуй? hVosttНо утверждения типа "ООП и реальность не сходится", это попытка оправдать неудачу при попытке забить гвоздь кулаком. Вот с этим не согласен. Как бы все хорошо, просто хотел еще лучше сделать. Вместо того чтобы выдавать исключение что метод не прописан - хочу проверять заранее. ХЗ чего вы все тут меня жизни учить собрались. Не мальчик уже. Формально ООП нарушаю, хотя тоже спорный вопрос. Если тоже самое сделаю через делегаты или интерфейсы и буду в базовом классе проверять предоставлен ли делегат/интерфейс, то будет фэншуй, ничего не изменится, но в дочернем классе будет больше букав. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 18:58 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TФормально ООП нарушаю, хотя тоже спорный вопросТы нарушаешь, как минимум 4 принципа из SOLID. Принцип D под вопросом, хотя, уверен ты его тоже нарушаешь. И это в трех классах. Dima TЕсли тоже самое сделаю через делегаты или интерфейсы и буду в базовом классе проверять предоставлен ли делегат/интерфейс, то будет фэншуй, ничего не изменится , но в дочернем классе будет больше букав.Да, ничего не изменится, ты так же будешь нарушать эти принципы. Ну, может, если повезет, ты начнешь соблюдать какой-либо принцип. Так что забей ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 19:23 |
|
|
start [/forum/topic.php?fid=20&msg=39390591&tid=1400091]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 166ms |
0 / 0 |