|
|
||||||
Нежданчик в наследовании01.10.2018, 17:17. Показов 2226. Ответов 41
Метки нет (Все метки)
или стреляем себе в ногу с помощью C#
5
|
||||||
| 01.10.2018, 17:17 | |
|
Ответы с готовыми решениями:
41
Конструктор при наследовании Ошибка в наследовании классов |
|
1536 / 545 / 127
Регистрация: 09.01.2018
Сообщений: 1,785
|
|
| 02.10.2018, 16:06 | |
|
Sanya_sa,
Неверно. Есть базовый класс родитель и метод имеется только у него. У наследника он виден лишь потому, что наследник наследует методы родителя. Но сам он никакого метода не объявлял, он его унаследовал. И переопределил. А у кого он переопределяется? Метод принадлежит родителю, у него он и будет переопределен. Наследник только наследует, своей реализации он не объявлял. Отсюда выходит, что невозможно вызвать старую реализацию метода родителя. Потому что ее переопределил наследник.
0
|
|
|
|
||
| 02.10.2018, 16:06 | ||
|
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 02.10.2018, 16:16 | ||
|
И будете вполне оправданно предполагать, что метод будет вызван с тем значением, о котором вы прочитали в документации. Когда мы используем статический метод Create типа XmlWriter, мы не можем знать, не лазя в исходники, что нам будет возвращена ссылка на экземпляр одного из нижеследующих типов:
Все они наследуются от XmlWriter и при этом имеют модификатор доступа internal, а значит о них ни слова в документации. И если в XmlWriter объявлен какой-то виртуальный метод со значениями по умолчанию, то можно себе представить вакханалию, которая будет твориться при его переопределении.
0
|
||
|
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
|
|
| 02.10.2018, 16:23 | |
|
0
|
|
|
|
||||||
| 02.10.2018, 17:21 | ||||||
|
Наверное все таки не логично.
False True False
0
|
||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||
| 02.10.2018, 17:28 | |||||||
![]() Вот так более логично бы выглядело?
Вы путаетесь потому, что смотрите на оба типа "с высоты птичьего полета" и видите реализацию обоих. Разнесите классы по разным сборкам и смотрите на код каждого отдельно от другого, как если бы вы его писали в данный момент.
0
|
|||||||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
|||||||
| 02.10.2018, 17:29 | |||||||
0
|
|||||||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
||||||
| 02.10.2018, 17:36 | ||||||
|
Возможно, вам и это покажется нелогичным
0
|
||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 02.10.2018, 17:58 | ||
3
|
||
|
14819 / 9600 / 1369
Регистрация: 21.01.2016
Сообщений: 36,145
|
||||||
| 02.10.2018, 18:14 | ||||||
|
kolorotur, кстати, раз пошло обсуждение "тонкостей" языка, то не могли бы вы прокомментировать данный код:
Т.е. строка public static readonly Some s = new Some(); выполняется при входе в метод Main, но до первой строки кода в нём. Если же расскомментировать статический конструктор, то поведение возвращается к ожидаемому: статическая инициализация начинает при обращении к типу Some. Я не смог нагуглить (я шибко и не старался) разъяснений по этому поведению.Что интересно, что в .NET Core всё работает как и ожидается.
0
|
||||||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
|||
| 02.10.2018, 19:24 | |||
|
Usaga, это прописано в спецификации языка C#
1
|
|||
|
|
|
| 02.10.2018, 19:25 [ТС] | |
|
TopLayer, вы тоже путаете саму перегрузку/переназначение и передаваемые параметры )
kolorotur, вы путаете мою мысль "нужно жестко ограничить" с "так не должно работать". То что "перегрузить" параметр по умолчанию нельзя, понятно и ежу -- он там прибит железобетонно. Мое "недовольство" вызвано именно возможностью подставить новое значение в "новом" методе. Дело в том, что большинство кода пишется абстракцией, и работаешь чаще с черным ящиком. И когда перегружаешь, то ожидаешь что в общем коде будет работать "по новому", а на самом деле нужно помнить что там не просто пустой вызов, а с явной передачей параметра (внезапно блин). Явность даного ньюанса где-то на том же уровне, что и н"еподгружаемостью" измененой константьі из другой сборки. Как по мне, логично было бы именно ограничить возможность переопределять базовый метод только с тем же контрактом переменых по-умолчанию. В таком случае казус технически не возможен.
0
|
|
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
|
| 02.10.2018, 19:31 | |
|
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 02.10.2018, 19:41 | |||
|
Usaga, товарищ TopLayer выше верно написал: если статический конструктор не объявлен, то инициализация отдается на откуп рантайму. До четвертой версии рантайма он производил инициализацию тогда, когда джиттерил первый метод, который обращался к статическим полям или создавал экземпляр этого класса.
В более поздних версиях он расслабился еще больше: например, может производить инициализацию хоть при запуске приложения или непосредственно при обращении — на свое усмотрение. Жестко ограничить не получится, потому что всегда есть возможность это обойти новой перегрузкой. Поскольку у вас есть свой класс с переопределенным методом и старым значением, из-за запрета ваш проект перестает компилироваться — будьте добры снова оттестировать этот паролямовый проект. С большой вероятностью вы просто матернетесь и сделаете тот же перегруженный метод без параметров, который вызывает переопределенный с нужным значением. Ну а если оно так тривиально решается, то зачем создавать разработчикам лишний головняк запретами?
1
|
|||
|
|
||
| 02.10.2018, 23:19 [ТС] | ||
|
Тут правда задаюсь вопросом, а можно ли как-то технически ограничить контракт переменой по умолчанию? По ходу это же просто метаданые метода, и на готовом exe уже не отличишь переменую подсунутую компилятором из атрибута и явно проставленую руками. Т.е. остается только предупреждать
1
|
||
|
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
|
|||
| 03.10.2018, 02:59 | |||
|
Добавлено через 4 минуты Добавлено через 47 минут Интересный тут пост для "начинающих" получился)))
0
|
|||
| 03.10.2018, 02:59 | |
|
Вопрос о наследовании типов ошибка в наследовании формы
Вызов конструктора при наследовании Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|