LINUX.ORG.RU

ООП, наследование классов

 ,


0

1

Почему везде предлагается непременно наследовать класс от готового? Например, читаю доки по Qt. Вот нельзя как будто объявить просто объект типа ТКнопка кнопка1 и работать уже с кнопка1, надо непременно наследованием сделать класс ТМояКнопка, даже если устраивает дефолтная, и плодить объекты уже этого типа. Это традиция просто или в этом есть какой-то смысл?

★★★★★

Вот нельзя как будто объявить просто объект типа ТКнопка кнопка1 и работать уже с кнопка1

можно, я разрешаю

Sahas ★★★★☆
()

надо непременно наследованием сделать класс ТМояКнопка

ЕМНИП ни разу не приходилось. Только top level window наследуется всегда, а даже всякие там дочерние контейнеры типа panel (или как оно там называлось), tab view, не говоря уже о тривиальных контролах типа кнопок и текстовых полей – ничего не наследовал.

dimgel ★★★★★
()
Ответ на: комментарий от yu-boot

А top level window зачем?

Да просто WYSIWYG-редактор форм в Qtcreator такой код генерирует. Да и всю GUI-логику надо куда-то пихать; вполне подходящее место. Может ещё какие-нибудь виртуальные методы переопределять приходилось, но в двух последних своих приблудах не вижу такого.

dimgel ★★★★★
()
Ответ на: комментарий от dimgel

У мя под PyQt вроде не наследует, хотя хз.

Но да, иногда это просто удобно:-)

AntonI ★★★★★
()

Наследование в С++ это штатный способ сваять динамический полиморфизм (в рантайме который).

Но вообще это просто бывает удобно, если у нескольких класс есть одинаковые атрибуты имеет смысл их вынести в общего предка.

AntonI ★★★★★
()

Если ты в силах написать свой GUI-тулкит, то можешь сделать без наследования. На интерфейсах. Тоже работоспособный вариант.

pup_kin
()

везде предлагается непременно наследовать класс от готового

Где везде? Зависит от тулкита. В Qt же всё на сигналах, там это ненужно. Даже если надо как-то визуально поменять что-то, там декораторы ЕМНИП для этого.

доки по Qt

Официальные доки? Почекал примеры, навскидку не вижу такого.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Доки есть.

Ставятся на девелоперский компьютер из веб-бандла вместе с QtCreator, компилятором и всем остальным. Можно по любому слову в редакторе исходного кода вызвать страничку документации внутри Криэйтора.

По идее доки должны быть и в пакетах Линукса. Но это не факт.

pup_kin
()
Последнее исправление: pup_kin (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Щас не найду где это было, готовый код из qt-creator хотя-бы, да.

Вообще этот подход я помню ещё с Borland C++ (который не Builder). Борландовский OWL 20 лет назад требовал наследовать практически всё, напрямую пользоваться низзя. Просто интересно было, откуда растёт этот подход, зачем столько мусорного кода.

yu-boot ★★★★★
() автор топика
Ответ на: комментарий от AntonI

Но вообще это просто бывает удобно, если у нескольких класс есть одинаковые атрибуты имеет смысл их вынести в общего предка.

Всё правильно, SOLID для дураков.

Psilocybe ★★★★
()

просто объект типа ТКнопка кнопка1 и работать уже с кнопка1

Почему нельзя, если тебя полностью устраивает реализация ТКнопка, то что мешает тебе пользоваться ей?

Другое дело, если не устраивает. Уверен, что не устраивает. Например, ты хочешь, чтобы при нажатии на кнопку совершались действия, нужные тебе, и о чем создатель ТКнопка ничего не знает.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Можно сделать ТКнопка так, чтобы реакция на нажатие делегировалась какой-то другой сущности, например «Сигнал/Слот», или что-то ещё. Но все равно нужно определять/переопределять код этой другой сущности. Это неизбежно.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Ничто же не мешает заложить в класс всякие Clicked() и описать его рядом для конкретного экземпляра кнопки? :)

yu-boot ★★★★★
() автор топика

Потому что delphi-like херня из под коня. Придумать что-то другое ума не хватает.

crutch_master ★★★★★
()

«Везде» — это устарело в 90-х. Везде предлагают предпочитать композицию наследованию.

slackwarrior ★★★★★
()

смотри сколько protected методов можно перегрузить и получить суперкнопку.

virtual void	enterEvent(QEvent *event)
virtual void	leaveEvent(QEvent *event)
virtual void	dropEvent(QDropEvent *event)
virtual void	dragEnterEvent(QDragEnterEvent *event)
virtual void	dragLeaveEvent(QDragLeaveEvent *event)
virtual void	dragMoveEvent(QDragMoveEvent *event)
virtual void	contextMenuEvent(QContextMenuEvent *event)

anonymous
()
Ответ на: комментарий от yu-boot

Вообще этот подход я помню ещё с Borland C++

Ну там-то понятно зачем, там обработчики это методы виджета.

откуда растёт этот подход

Казалось естественным на том уровне понимания ООП.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от yu-boot

Просто интересно было, откуда растёт этот подход, зачем столько мусорного кода.

это ООП, детка

anonymous
()

Вот нельзя как будто объявить просто объект типа ТКнопка кнопка1 и работать уже с кнопка1, надо непременно наследованием сделать класс ТМояКнопка, даже если устраивает дефолтная, и плодить объекты уже этого типа.

Можно! Я постоянно готовый QPushButton использую. Вообще, наследую я в GUI, в основном, от QMainWindow или QDialog (да и то, простой QDialog во многих случаях можно использовать готовый, добавив туда элементы программно). А все элементарные виджеты использую как есть.

Например, читаю доки по Qt

Ты, наверное, читаешь ту часть доков где описывается Вся Мощь ООП (c). То есть в каких-то особых случаях действительно бывает разумным создать свою кнопку с нестандартной логикой. Но такие случаи — исключения, не правило.

hobbit ★★★★★
()

Вот нельзя как будто объявить просто объект типа ТКнопка кнопка1 и работать уже с кнопка1

Можно, разрешаю. Thread/0 🤦‍♂️

erfea ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.