-Поиск по дневнику

Поиск сообщений в AliFerster

 -Музыка


Мысль 0x0227. Конструкторы

Суббота, 09 Октября 2010 г. 13:12 + в цитатник
Раньше как-то не задумывался подробно о конструкторах. Обычно просто в производном классе прописываю вызывающий базовый. А что будет, если его не писать - даже не приходило в голову.

А вчера внезапно обратил внимание на тот факт, что и Builder, и Visual Studio автоматически помещают в код формы конструктор. Причём, в билдере он пустой, и его нельзя удалить (приведёт к ошибке компиляции), а в студии он, хоть и не пустой (содержит метод, создающий все размещённые на форме при помощи дизайнера компоненты), его можно спокойно закомментировать - это не только не приводит к ошибке, но даже форма спокойно создаётся! (Правда, пустая и с параметрами по умолчанию).

Сначала обратился к decoder_2q - такому крутому чуваку, знающему всё-всё-всё. Правда, вопрос мой изначально стоял по-другому: "Зачем в билдере и студии предусмотрено событие создании формы (OnCreate в билдере и Load в студии), если есть конструктор?". Вот что он ответил:

decoder_2q (21:25:41 8/10/2010)
конструктор - генерится самим приложением разработки программ
decoder_2q (21:25:51 8/10/2010)
и предпологается что ты туда лезть не будешь
decoder_2q (21:26:02 8/10/2010)
так что правильнее пользоваться онлоадом
Алексей Сыротяк (21:28:34 8/10/2010)
а вообще странно
ну, студия в конструкторе пишет хотя бы InitializeComponent();
а билдер-то его вообще пустым создаёт
не понимаю - зачем?
decoder_2q (21:29:00 8/10/2010)
потому что это си
decoder_2q (21:29:13 8/10/2010)
в си не может быть классов без конструкторов
Алексей Сыротяк (21:29:21 8/10/2010)
а, точно, они не наследуются?
Алексей Сыротяк (21:30:06 8/10/2010)
я вспомнил - они не наследуются, и поэтому в производном нужно прописывать конструктор, вызывающий базовый
так?
decoder_2q (21:30:15 8/10/2010)
да)


Я действительно недавно встретил фразу "конструкторы не наследуются". Это было, кажется, в книге Шилдта по C#. Впрочем, как будет видно ниже, C# в этом отношении ведёт себя так же, как и С++.

Вроде бы вопрос был закрыт, однако сегодня утром я обратил внимание на несостыковочку, указанную в начале поста: в билдере конструктор формы можно убрать, а в студии - нет. Для выяснения этого вопроса я создал пустые проекты в билдере (C++) и в студии (C#) и синхронно экспериментировал с 2 классами.
Далее привожу часть лога с аси (это я писал уже Михе) как есть:

Алексей Сыротяк (11:29:51 9/10/2010)
мне вчера таки интересно стало
я, кажется, окончательно разобрался с теми конструкторами!
Не наследуются только конструкторы с параметрами (это и в С++, и в C#)
Констукторы без параметров таки наследуются!

я создал и в билдере, и в C# два класса - базовый и производный
сначала в первом был констурктор с 0 параметрами, во втором - вообще не было конструктора
при создании производного объекта вызывался первый

затем я внёс во второй класс пустой констурктор с 0 параметрами, но не указывал, что нужно обращаться к базовому
всё равно вызывался первый (а затем второй)

затем я убрал конст. с 0 параметрами с первого
и поставил с 1 параметром
перстал наследоваться
более того, я не смог создать производный объект, пока явно не наследовал конструктор с вызовом базового

затем я расположил в базовом 2 констр. - с 0 и 1 параметрами
в производном - с 1 параметром, но без явной передачи базовому
производный сначала вызывал базовый с 0 параметрами, а затем выполнял свой с 1 параметром!

итог: в С++/C# наследуются исключительно конструкторы без параметров

Алексей Сыротяк (11:34:50 9/10/2010)
а в Дельфи, если не ошибаюсь, наследовались абсолютно все конструкторы, и меня это очень удручало (первый раз я даже не смог выбросить лишний наследованный конструктор, а во второй раз это удалось, но - введением промежуточного класса с приватным конструктором)


Итог написан выше: в С++ и C# конструкторы без параметров наследуются, а с параметрами - нет.

Но почему же конструктор формы можно убрать в студии, и нельзя - в билдере? Да потому, что в студии он не имеет параметров (и наследуется), а в билдере он принимает параметр Owner, и должен быть определён явно.
Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку