Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Как правильно унаследовать TPoint2D от TPoint3D/ Правильно ли наследовать? ООП

24.11.2016, 22:15. Показов 2187. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Два пользовательских класса: Точка в 2D пространстве и точка в 3D пространстве.

C++
1
2
3
4
5
6
7
class TPoint3D{
        int X,Y,Z;
    public:
        set_x(int x){}
        set_y(int y){}
        set_z(int z){}
};
Логично предположить, что 2D можно унаследовать от 3D (части целого от своего целого)
C++
1
2
3
4
5
class TPoint2D{
        int X,Y,Z;
    public:
    
};
Это обычный принцип ООП, где от целого наследуются части этого целого.
С точки зрения самого принципа, здесь так делать правильно, а с точки зрения удобства - нет. Этот Z-хвост мешает мне жить.

Я, конечно, могу унаследовать не от TPoint3D, а от какого-то абстрактного класса типа TPointAbstract, но это будет противоречить словам принципа: "Части от целого".

Я не понимаю, как быть. Можно ли здесь уложиться в принципы ООП?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.11.2016, 22:15
Ответы с готовыми решениями:

Как правильно унаследовать класс?
Есть класс для работы с большими целыми знаковыми числами. public class BigNum { static int base = 100; static int...

Как правильно унаследовать ostream, istream ?
Ну вообщем цель такова, чтобы в функцию можно было передать либо обьект моего класса, либо же cout , cin. MyStream mout = MyStream(); ...

Как правильно наследовать форму
Добрый вечер! В программе имеется форма с различными компонентами (связанными с БД) и мне нужна еще одна форма, которая была бы копией...

19
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.11.2016, 22:25
Цитата Сообщение от daslex Посмотреть сообщение
Логично предположить, что 2D можно унаследовать от 3D (части целого от своего целого)
Где это вы, интересно, такой принцип вычитали?
Открытое наследование реализует отношение "является разновидностью". 2D не является разновидностью 3D, поэтому не может быть от него унаследован, наоборот можно.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
24.11.2016, 22:40  [ТС]
Как где, на форуме кто-то очень ругался, когда окружность от точки наследуют, и в книгах предпочтение отдают агрегации/композиции и наследованию частей из того, что вместе из себя они представляют. Так быстрее строится некоторого рода система, которую создаёшь (вверх если, то лезешь всё выше и выше, получается очень громоздко и перестраивать тяжело, не знаешь, когда остановиться, азарт иногда берёт; а вниз - приходишь к конечному достаточно быстро, что ниже просто некуда).

Можно, но потом однажды сделаешь наследование круга от точки (сейчас это образное выражение) и словишь оплеух. Говорят, что время так разрулило, где от большего наследуются отдельные элементы этого большего. (Здесь своими словами я сказал, не помню, как говорят и пишут)
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.11.2016, 22:49
Цитата Сообщение от daslex Посмотреть сообщение
и в книгах предпочтение отдают агрегации/композиции и наследованию частей из того, что вместе из себя они представляют
Ну, то ли книги неправильные, то ли вы их не так поняли.
Тип - это описание некоторого множества объектов реального мира. Подтип, т.е. некий наследник этого типа - это описание подмножества объектов данного типа. Ну, скажем, тип ЧЕЛОВЕК описывает множество всех людей. Но в нем есть подмножества мужчин и женщин, следовательно для их описания можем создать типы-наследники от типа ЧЕЛОВЕК - подтипы МУЖЧИНА и ЖЕНЩИНА.
В общем, открытое наследование - это конкретизация. В типе ЧЕЛОВЕК мы абстрагировались от многих параметров конкретного человека, от пола, например. Наследование, это когда мы из множества параметров, от которых мы абстрагировались, извлекаем те, которые нам понадобились, и добавляем в свойства класса.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
24.11.2016, 22:55  [ТС]
Целое => Человек.
От целого производятся мужчина и женщина, что и есть "От целого части этого целого".

Неудачный пример.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.11.2016, 23:00
Цитата Сообщение от daslex Посмотреть сообщение
Целое => Человек.
От целого производятся мужчина и женщина, что и есть "От целого части этого целого".
Неудачный пример.
Ну, в смысле описываемых типами множеств это верно. Но вы как-то пытались неверно трактовать.
Двумерная точка - это когда мы от всех размерностей кроме двух абстрагировались. Но среди двумерных есть подмножество, которое имеет третью координату, т.е. можем наследовать от двумерной трехмерную. Т.е. наследник обладает всеми признаками базового класса, плюс еще какими-то.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
24.11.2016, 23:03  [ТС]
Смотрите. Я приведу более понятную ситуацию. Предположительно, изначально не было известно, что существуют какие-то виды объектов, не обладающие свойствами, характеризующие эти объекты. Мутить воду не буду, покажу псевдосистемой.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class TNature{};
 
class TBird: public TNature{
public:
    void fly(){}; //Птицы умеют летать
};
 
//Пршло много времени, программа прилично развилась, обросла.
//Оказалось, что живут птицы, которые не летают
//Добавили в систему, куда деваться.
class TChiken: public TBird{
public:
    // Летит, зараза
};
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.11.2016, 23:11
Цитата Сообщение от daslex Посмотреть сообщение
Смотрите. Я приведу более понятную ситуацию.
Не-не, те признаки, которые мы уже извлекли из небытия, как раз и являются критерием принадлежности к нашему типу. Если не летает, то и не ПТИЦА, следовательно не может быть наследником. В наследниках мы можем только конкретизировать данный тип, т.е. выделять какие-то подмножества летающих, каркающие на лету, например.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
24.11.2016, 23:21  [ТС]
Это противоречит природе вещей
Африка́нский стра́ус (лат. Struthio camelus) — бескилевая нелетающая птица,
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.11.2016, 23:26
Цитата Сообщение от daslex Посмотреть сообщение
Это противоречит природе вещей
Африка́нский стра́ус (лат. Struthio camelus) — бескилевая нелетающая птица,
Ну, вы уже передергивать начинаете. То мы обсуждаем класс ПТИЦА, объявленный в программе, то вы уже на реальных птиц перекинулись. В программе-то ПТИЦА - это летающая птица, т.е. описывающая летающее подмножество множества реальных птиц, а не их всех. Т.е. страус изначально пролетел, так что ему не светит!
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
24.11.2016, 23:34  [ТС]
Здесь, в принципе, легко понять, что всего-то нужен новый класс, который обозначит вид исключений. Это, наверное, единственный правильный выход.

Для птиц - TBird_nofly - какой-нибудь, если летать не умеют. Только это ж как тяжело потом что-то добавлять туда и удалять оттуда, исправлять там что-то. Если один объект-исключение, то не так страшно, а если система большая и там их под тысячу? Ничего хорошего от такого можно не ждать, наверное.

Добавлено через 1 минуту
Я об общих схожих свойствах, где дублировать нужно.'
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
25.11.2016, 08:57
Цитата Сообщение от daslex Посмотреть сообщение
но это будет противоречить словам принципа: "Части от целого"
Я не знаю в каком месте вы это вычитали, но
Цитата Сообщение от daslex Посмотреть сообщение
могу унаследовать не от TPoint3D, а от какого-то абстрактного класса типа TPointAbstract
то что вам нужно. См. паттерн "компоновщик".
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
25.11.2016, 09:50
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Цитата Сообщение от daslex Посмотреть сообщение
Здесь, в принципе, легко понять, что всего-то нужен новый класс, который обозначит вид исключений. Это, наверное, единственный правильный выход.
Для птиц - TBird_nofly - какой-нибудь, если летать не умеют. Только это ж как тяжело потом что-то добавлять туда и удалять оттуда, исправлять там что-то. Если один объект-исключение, то не так страшно, а если система большая и там их под тысячу? Ничего хорошего от такого можно не ждать, наверное.
Выше пытались донести, что в программу уже были заложены ограничения, которые определяют свойства системы. В этих ограничениях, в частности, сказано, что все птицы в программе - летают. Это уже аксиома в рамках системы.
Добавление наследника с пустой функцией fly - это костыль, с которым, возможно, пришлось бы мириться в реальной жизни, но это уж точно не "единственный правильный выход". Правильный выход - это перепроектировать систему с учетом новых требований. Т.е. сделать класс "птица", от него два наследника "летающие_птицы" и "нелетающие_птицы", соответственно, функция fly будет только у первых.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.11.2016, 20:38  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Добавление наследника с пустой функцией fly - это костыль
Да я ж сказал, что это мешает мне жить

Похоже, что где-то Вы целостную ситуацию немного неправильно поняли. Может, устали. То, о чём я сказал "правильный выход", там я не имел в виду наследование от птиц нелетающих птиц, а всего лишь новый тип, который в иерархии ляжет на один уровень с типом "Птица". Это в контексте должно было быть понятно.

Это сообщение сейчас всего-лишь маленькое уточнение, в связи с небольшой зародившейся кашей.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
31.12.2016, 01:08
Цитата Сообщение от daslex Посмотреть сообщение
Я не понимаю, как быть. Можно ли здесь уложиться в принципы ООП?
К размышлению
2
31.12.2016, 01:23

Не по теме:

Цитата Сообщение от korvin_ Посмотреть сообщение
К размышлению
Ох и сложно там для неокрепших.
Пришлось через хабр https://habrahabr.ru/post/83269/подбираться.

0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
31.12.2016, 01:56
Цитата Сообщение от John999 Посмотреть сообщение
Ох и сложно там для неокрепших
Да-да, неокрепший, лезущий в дебри сложных определений, - таки душераздирающее зрелище!
Мне кажется, самым неокрепшим для начала надо освоить правило 35 Скотта Майерса из "50 рекомендаций": "используйте открытое наследование для моделирования отношения "есть разновидность".
1
 Аватар для John999
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
31.12.2016, 02:09
Цитата Сообщение от Mr.X Посмотреть сообщение
правило 35
Ищу,ищу: "Что это за книга?, что за издание?... Почему у меня нет? "
А это правило 32.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
31.12.2016, 02:18
Цитата Сообщение от John999 Посмотреть сообщение
Ищу,ищу. "Что это за книга?, что за издание?... Почему у меня нет? "
А это правило 32.
Ну, у меня книга 2006 года, в новых изданиях возможно другая нумерация.
0
 Аватар для John999
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
31.12.2016, 03:33
Понял, это книги разные
Цитата Сообщение от Mr.X Посмотреть сообщение
"50 рекомендаций"
это More effective C++,
а у меня Effective C++.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2016, 03:33
Помогаю со студенческими работами здесь

Как правильно наследовать на Symfony?
Привет всем форумчане! Хотел создать простой блог на сифони. Но сталкнулся со следуещей проблемой Attempted to...

Как правильно наследовать публичный конструктор?
class lorry не могу наследовать public car а именно char*mr _> car(mr) - здесь ошибка((( #include<iostream> using namespace std;...

Как правильно наследовать несколько элементов
Вот код: #region Directives using System; using System.Drawing; using System.Windows.Forms; #endregion #region Workplace ...

Как правильно наследовать методы класса
#include <iostream> using namespace std; class Pair { protected: int first; // первое число int second; ...

Как в Yii правильно наследовать модели?
Есть 2 таблицы - t_product и t_service , в них одинаковые поля: название, цена и т.д. Я создал модели и сгенерировал CRUD. Сделал так,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru