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

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

24.11.2016, 22:15. Показов 2136. Ответов 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 05.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 17.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru