|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#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 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Похоже тему пора закрывать, полноценное ТЗ я не готов выложить, а домыслов у каждого немеряно. Шары хрустальные протрите, прежде чем телепатию включать ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 19:38 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TТо что рефлексией пользуются все сереализаторы это фэншуй? В самой рефлексии ничего плохого нет. Но если можно решить задачу без рефлексии, надо решать её без рефлексии. Dima TКак бы все хорошо, просто хотел еще лучше сделать. Вместо того чтобы выдавать исключение что метод не прописан - хочу проверять заранее. ХЗ чего вы все тут меня жизни учить собрались. Не мальчик уже. Ты странно реагируешь на критику. Никто тебя учить не собирается. Я высказал свои соображения и сказал, что не согласен с твоим утверждением. Dima TФормально ООП нарушаю, хотя тоже спорный вопрос. Если тоже самое сделаю через делегаты или интерфейсы и буду в базовом классе проверять предоставлен ли делегат/интерфейс, то будет фэншуй, ничего не изменится, но в дочернем классе будет больше букав. Почему ты хочешь решить задачу именно в дочернем классе? Если формально, процесс сохранения у тебя уже выделен в отдельный метод, значит его можно выделить в отдельный класс, например, как стратегию. И это полностью решает твои проблемы, совсем небольшой ценой. Ты можешь иметь несколько стратегий и применять к одной и той же реализации. Например, у тебя одна Работа, но разное Сохранение (в файлы разных типов, в базу данных..) Существует золотое правило: всегда отдавай предпочтение композиции вместо наследования. Если же ты монстрячишь иерархию классов, никогда не забывай про принцип замещения Лисков. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 21:45 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
А что никто не предложит впендюрить какой нибудь дурацкий IoC контейнер? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 22:26 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
ЕвгенийВА что никто не предложит впендюрить какой нибудь дурацкий IoC контейнер? До этого ещё дожить надо ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 22:47 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttПочему ты хочешь решить задачу именно в дочернем классе? Если формально, процесс сохранения у тебя уже выделен в отдельный метод, значит его можно выделить в отдельный класс, например, как стратегию. И это полностью решает твои проблемы, совсем небольшой ценой. Ты можешь иметь несколько стратегий и применять к одной и той же реализации. Например, у тебя одна Работа, но разное Сохранение (в файлы разных типов, в базу данных..) Это конвертеры для интеграции нашей системы с клиентскими, у каждого клиента свои форматы обмена, они и прописываются в дочернем классе. Один дочерний класс удобен тем, что из его методов необходимо вызывать методы базового и методы дочернего иногда используют свои общие свойства/методы. Задача уже успешно решена именно дочерним классом. Эта сотня реализаций за 10 лет накопилась. Претензий к архитектуре за это время не возникло, поэтому нет смысла изобретать новый велосипед. Сейчас просто идет смена ЯП, т.е. переписывание с фокспро на C#. Причины вовсе не в архитектуре, а в том что у C# возможностей больше (многопоточность, юникод, скорость разбора файлов выше и т.д.) Нет цели переписать сразу все. То что работает - пускай дальше работает, а если возникает какая-то необходимость переписывания какой-то части функционала дочернего класса, то эта часть прописывается в новый конвертер, а старый продолжает заниматься остальным. Разделение функционала происходит на уровне инишников и/или параметров при запуске. Вобщем эпопея еще на 5-10 лет. Худшее что тут может произойти - новый конвертер заберет инфу, которую не сможет обработать. Для этого и надо проверку что обработка прописана. Можно конечно явно в коде флаги ставить, но к писателю тоже доверия мало, скопипастит установку флага из другого проекта, а метод не пропишет и получили мину замедленного действия: пока запускается как положено - все работает, запустили нестандартно - проимели инфу. Поэтому лучше через рефлексию порешать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 08:42 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TМожно конечно явно в коде флаги ставить, но к писателю тоже доверия мало, скопипастит установку флага из другого проекта, а метод не пропишет и получили мину замедленного действия: пока запускается как положено - все работает, запустили нестандартно - проимели инфу. Поэтому лучше через рефлексию порешать. Почему метод не сделать абстрактным, а не виртуальным, что заставит переопределять этот метод всегда, и проверять ничего будет не нужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 10:01 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttПочему метод не сделать абстрактным, а не виртуальным, что заставит переопределять этот метод всегда, и проверять ничего будет не нужно? я кажется догадываюсь и картина печальна. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 10:04 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttПочему метод не сделать абстрактным, а не виртуальным, что заставит переопределять этот метод всегда, и проверять ничего будет не нужно? Потому что задача обратная: не "заставить прописать", а использовать только прописанное, чтобы переезжать с одного EXE на другой постепенно переписывая функционал, а не сразу все. Некогда этим долго заниматься, да и работа это дурная: писать лишь бы списать. Если уже написано и работает как надо, то пусть дальше работает. Потребуются изменения - тогда и писать. Пока писал мысль появилась как по другому порешать: по сути задача сводится к тому что всё, что не смог обработать новый конвертер, надо скормить старому, который знает что с этим делать. Тут проблема что старый не умеет вторым номером работать, но это можно допилить. Тогда все по фэншую будет: в базовом классе в виртуальном методе пропишу вызов старого EXE, тогда если метод перепрописан в дочернем, то он отработает, если нет - базовый вызовет старый EXE и отдаст инфу ему на обработку. И не надо будет ни флагов, ни рефлексии. Осталось оценить как много в старом допиливать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 12:19 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TТогда все по фэншую будет: в базовом классе в виртуальном методе пропишу вызов старого EXE, тогда если метод перепрописан в дочернем, то он отработает, если нет - базовый вызовет старый EXE и отдаст инфу ему на обработку а метод дочернего - не может просто вернуть логическое значение справился/не справился ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 12:52 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TТогда все по фэншую будет: в базовом классе в виртуальном методе пропишу вызов старого EXE, тогда если метод перепрописан в дочернем, то он отработает, если нет - базовый вызовет старый EXE и отдаст инфу ему на обработку. И не надо будет ни флагов, ни рефлексии. Осталось оценить как много в старом допиливать. Кажется ты начинаешь понимать, как устроен ООП :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 13:29 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Изопропила метод дочернего - не может просто вернуть логическое значение справился/не справился ? Это было бы слишком просто. Так не интересно ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 13:29 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
ИзопропилDima TТогда все по фэншую будет: в базовом классе в виртуальном методе пропишу вызов старого EXE, тогда если метод перепрописан в дочернем, то он отработает, если нет - базовый вызовет старый EXE и отдаст инфу ему на обработку а метод дочернего - не может просто вернуть логическое значение справился/не справился ? Он исключение дает если не справился. Исключение ловится, в лог пишется, необработанная инфа остается в очереди на обработку. И так по кругу пока не обработается корректно или админ удалит из очереди. Эта схема нормально работает если дочерний метод прописан. Проблема в другом: инфа забирается с удалением на сервере и только затем запускается этот самый метод. В итоге имеем кучу ошибок в логе и инфа не забирается на обработку туда где есть обработчик. Не удалять с сервера пока не обработается - нельзя, т.к. это отдельная тема с переделкой сервера. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 13:43 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttКажется ты начинаешь понимать, как устроен ООП :) ИМХО ООП на EXE-шниках это костыль покруче рефлексии :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 13:49 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TОн исключение дает если не справился. Речь не об исключениях -- это натуральная ошибка, а о сигнализации того, что задача не была выполнена. Т.е. в твоём случае, сохранение не было выполнено. Базовая реализация метода может возвращать всегда False, или объект с результатом и свойством Success. При переопределении, возвращаем успех, если всё хорошо. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 14:11 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TВ итоге имеем кучу ошибок в логе и инфа не забирается на обработку туда где есть обработчик. Не удалять с сервера пока не обработается - нельзя, т.к. это отдельная тема с переделкой сервера. так мух от котлет оделить нужно - не справился, потому что не умеет - это одно - направить старому обработчику, не справился, потому что ошибка (при обмене данными и тп) - писать в очереди, журналы и тп. Зачем это смешивать? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 14:37 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
ИзопропилDima TВ итоге имеем кучу ошибок в логе и инфа не забирается на обработку туда где есть обработчик. Не удалять с сервера пока не обработается - нельзя, т.к. это отдельная тема с переделкой сервера. так мух от котлет оделить нужно - не справился, потому что не умеет - это одно - направить старому обработчику, не справился, потому что ошибка (при обмене данными и тп) - писать в очереди, журналы и тп. Зачем это смешивать? Я о том же 20142734 читай внимательнее. Dima Tв базовом классе в виртуальном методе пропишу вызов старого EXE, тогда если метод перепрописан в дочернем, то он отработает, если нет - базовый вызовет старый EXE и отдаст инфу ему на обработку. может так понятнее Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Как только в Derived прописали, так сразу из Base перестал вызываться А вы мне тут оба про какие-то return false. У меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 15:12 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TУ меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. Ну вообще-то есть. Штатные ситуации не должны решаться через исключения. И это не вопрос фломастеров, из адекватной команды с такими фломастерами гарантировано попрут на вольные хлеба. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 15:26 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttDima TУ меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. Ну вообще-то есть. Штатные ситуации не должны решаться через исключения. И это не вопрос фломастеров, из адекватной команды с такими фломастерами гарантировано попрут на вольные хлеба. Опять про фэншуй началось. Я писал применительно к конкретной задаче. Тут штатные ситуации: не качается потому что инет отпал, невозможно создать файл потому что прав нет или место на диске кончилось или путь в сеть а там перезагрузка и т.д. и т.п. Я не любитель исключений, но раз .Net сыпет разнообразными исключениями, то смысла нет к отлову их исключений добавлять свой способ передачи ошибок. Тем более что в 99% случаев вся обработка ошибки сводится к записи в лог. То что можно исправить, обычно исправляется непосредственно в том месте где обнаруживается. PS Тебя в команду разработчиков .Net надо заслать, пусть побольше методов TryXXX() понаделают. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 16:51 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TОпять про фэншуй началось. Я писал применительно к конкретной задаче. Какой ещё феншуй? Разработка, программирование, это инженерная дисциплина. Dima TЯ не любитель исключений, но раз .Net сыпет разнообразными исключениями, то смысла нет к отлову их исключений добавлять свой способ передачи ошибок. Тем более что в 99% случаев вся обработка ошибки сводится к записи в лог. То что можно исправить, обычно исправляется непосредственно в том месте где обнаруживается. Исключения не должны использоваться в ситуациях, которые ты ожидаешь. Например, некорректный ввод пользователя не должен порождать исключение. Просто ты в очередной раз высказал утверждение, с которым трудно согласиться, а именно: Dima TУ меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. Возврат и обработка ошибок не стоит делать через механизм исключений. Об этом написано у многих уважаемых авторов. И с опытом приходит понимание почему. Dima TPS Тебя в команду разработчиков .Net надо заслать, пусть побольше методов TryXXX() понаделают. Ну там их хватает. Кроме того, много чего можно проверить: наличие места на диске, наличие сетевого соединения, наличие прав для создания файла. И предусмотреть альтернативные варианты. Я понимаю, что такие проверки делать лень, проще поймать обобщённый Exception и записать его в лог. Но это не показатель, ни качественной разработки, ни профессионализма. Демонстрируя плохую практику, хотя бы подписывай, что да это говнокод, но с меня и не требуют другого. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 17:27 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TУ меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. это и есть одна из причин появления болезненных идей ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 17:39 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
может метод представить как виртуальное свойство только для чтения с типом делегата. ты легко сможешь проверить, делегат базового класса задан для данного свойстве или какой то другой, от дечернего класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 17:44 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
И эти все танцы с бубном вместо классической "Strategy" ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 18:41 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttПросто ты в очередной раз высказал утверждение, с которым трудно согласиться, а именно: Dima TУ меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. вот что отказывается зацепило. Давай договоримся на будущее: ты переспроси прежде чем выдернуть строчку из моего поста и на ее основе сделать далеко идущие выводы и на их основании меня тут критиковать и обсирать. У тебя домыслы неправильные, а я виноват. Чудесненько. Впиши в свой алгоритм телепатии что ТС всегда думает в рамках своей задачи, а не в рамках глобального мироустройства программирования, до которых ты раздул. Я в рамках своей задачи пишу, а ты раздуваешь не вникая. Про "фломастеры" было написано чтобы пресечь срачь по поводу обоих подходов. Извиняй, если не совсем корректно выразился, хотел поставить акцент на одно, получилось на другое. В целом лично я против исключений и это написал выше. Работать с ними особо не умею, т.к. до C# благополучно жил без них. В .Net они есть, приходится искать способы как с ними ужиться. Если уж цитировать, то так Dima TА вы мне тут оба про какие-то return false. У меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. В данном случае речь о тех самых дочерних методах, которые делают одно из двух: 1. Получают от базового класса на вход объект, сериализуют специфическим образом и записывают в файл. 2. Получают на вход файл, десериализуют и отправляют объект в базовый класс для дальнейшей транспортировки. Тут возникает куча исключений, которые генерит .Net (файловый ввод-вывод, сеть). В первом случае моих исключений вообще нет. Во втором - я кидаю исключение если на входе полная лажа, которую невозможно разобрать. Стоит тут писать return false? Тем более что реакция на него точно такая же как на любое исключение - записать в лог. Я тебе это уже писал 20145681 . Ты читай все, а не только то что тебе хочется прочитать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 20:23 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima T вот что отказывается зацепило. Давай договоримся на будущее: ты переспроси прежде чем выдернуть строчку из моего поста и на ее основе сделать далеко идущие выводы и на их основании меня тут критиковать и обсирать. Боже ж ты мой, никто тебя лично не обсирает и не критикует. Твои слова это не ты. Dima TУ тебя домыслы неправильные, а я виноват. Ты можешь это доказать? Неправильность моих слов? Если можешь, давай. Если не можешь, к чему это пустословие? Dima TРаботать с ними особо не умею, т.к. до C# благополучно жил без них. В .Net они есть, приходится искать способы как с ними ужиться. Если не особо умеешь, чего тогда сопротивляешься? Прими к сведению то, что тебе говорят, не обязательно всему слепо следовать. Это же обмен мнениями, обмен информацией. Очень плохо, если ты всё принимаешь на свой личный счёт и не можешь извлечь из этого выгоду. Dima T1. Получают от базового класса на вход объект, сериализуют специфическим образом и записывают в файл. 2. Получают на вход файл, десериализуют и отправляют объект в базовый класс для дальнейшей транспортировки. Эти задачи стоит разделить. Если сейчас тебе не сподручно, возьми на заметку, на будущее. Но не забывай, что технический долг рано или поздно ощутимо и больно бьёт в итоге, если проект у тебя на поддержке. Dima TВо втором - я кидаю исключение если на входе полная лажа, которую невозможно разобрать. Стоит тут писать return false? Тем более что реакция на него точно такая же как на любое исключение - записать в лог. Именно. Стоит возвращать результат об успехе операции, а не бросать исключение. Так ты задаёшь контракт использования. По сигнатуре функции видно, что надо ожидать результат и его обрабатывать. По сигнатуре функции не видно, какие ты там исключения собираешься бросать. Исключения, это исключительная ситуация, это значит, что произошло что-то такое, что программист не смог предусмотреть. Dima TЯ тебе это уже писал 20145681 . Ты читай все, а не только то что тебе хочется прочитать. Я прочитал, что ты нелюбитель исключений. Но это идёт вразрез с некоторыми твоими утверждениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 20:54 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TВо втором - я кидаю исключение если на входе полная лажа, которую невозможно разобрать. Стоит тут писать return false? Тем более что реакция на него точно такая же как на любое исключение - записать в лог. отсутствие обработчика - относится к нормальному функционированию. Причём повтор бесполезен ( в отличие скажем от сетевой ошибки или переполнения диска) Спросил как сделать по-человечески - тебе ответили, а делать можешь как хочешь ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 21:19 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#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. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
Manage.ParseDoc1() это тот самый разбор формата конкретного клиента. Пишется индивидуально каждому. ТЗ по умолчанию: Каждый файл самодостаточен, никак не связан с остальными, порядок обработки файлов не имеет значения. Файл может быть удален только после успешной отправки, в остальных случаях надо писать ошибку в лог и сигналить админу. Дальше админ решает что делать: сам удалит, повторно сгенерит, руками поправит и т.д. и т.п. Т.е. снаружи метода ParseDoc1() можно только ошибки писать и тупо по кругу пытаться обработать. ParseDoc1() самодостаточен. Там может произойти любое исключение: от файловой системы, от используемых классов и т.д. Ловить их внутри неправильно по науке, т.к. ловить надо только то что можешь обработать, а обрабатывать ТЗ не разрешает, а необходимая инфа о проблеме уже содержится в исключении. Теперь про исключения написанные мной: например исключение Xml.XmlException может выдать XmlReader при разборе кривого XML, но в случае построчного разбора кривого TXT исключений нет, но я определяю что структура не соответствует ожидаемой, тут я считаю нужно выдать исключение, т.к. ситуация необрабатываемая. Причины исключений в генераторах этих файлов, если админ не в состоянии их устранить, то просто говорит что такая-то ошибка на таком-то виде файлов должна обрабатываться так-то, например перекладывать файл в другую папку. Это прописывается внутри ParseDoc1() ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2017, 13:06 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1400091]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
others: | 279ms |
total: | 441ms |
0 / 0 |