Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Классы геометрических фигур


Автор: zzkoderzzzx 16.10.2013, 11:12
В учебниках часто приводят иерархию классов 
Код

class Tochka
{
//
};
class Storona:public Tochka
{
//
};
class Treugolnik:public Storona
{
//
};

Правильна ли она с точки зрения ООП? 
Вроде как сторона не является точкой, а треугольник стороной, почему тогда они наследуются друг от друга?

Автор: baldina 16.10.2013, 11:14
Цитата(zzkoderzzzx @  16.10.2013,  11:12 Найти цитируемый пост)
Правильна ли она с точки зрения ООП

нет

Цитата(zzkoderzzzx @  16.10.2013,  11:12 Найти цитируемый пост)
В учебниках часто приводят

плиз ссылку на такой учебник

Автор: vinter 16.10.2013, 11:15
Впервые вижу такую иерархию. Да, она не отражает отношение "является" и, следовательно, не совсем корректна с точки зрения здравого смысла.

Автор: baldina 16.10.2013, 11:18
zzkoderzzzx, http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%91%D0%B0%D1%80%D0%B1%D0%B0%D1%80%D1%8B_%D0%9B%D0%B8%D1%81%D0%BA%D0%BE%D0%B2

Автор: zzkoderzzzx 16.10.2013, 11:32
Цитата(baldina @ 16.10.2013,  11:14)
плиз ссылку на такой учебник

Книгу где это было не помню.

Пример того, что такой подход используется.
http://www.cyberforum.ru/cpp-beginners/thread681679.html

Автор: baldina 16.10.2013, 11:54
это не пример, потому что даже там предложивший подобное г$ пишет
Цитата

Получился бред, конечно, но преподам, в основном, это и нужно.

Автор: zzkoderzzzx 16.10.2013, 13:19
В том задании предлагается реализовать еще класс круга с наследованием от класса линии. Как это сделать (чтобы не просто унаследоваться, а использовать данные класса-предка)? 
Зачем то предлагается "не использовать виртуальные функции". Какой в этом смысл?

Автор: bsa 16.10.2013, 13:31
Цитата(zzkoderzzzx @  16.10.2013,  14:19 Найти цитируемый пост)
Как это сделать (чтобы не просто унаследоваться, а использовать данные класса-предка)? 
Класс линия содержит как минимум два атрибута - координаты двух точек. Одну можно назначить центром окружности, вторую лежащей на окружности. Расстояние между ними - это радиус. Дальше объяснять? Можно поступить иначе, и посчитать, что обе точки являются лежащими на окружности, а прямая - диаметр ее. Таким образом, центр прямой (по факту, ее отрезка, так как даны две точки) - это центр окружности, а половина расстояния между точками - радиус.

Цитата(zzkoderzzzx @  16.10.2013,  14:19 Найти цитируемый пост)
Зачем то предлагается "не использовать виртуальные функции". Какой в этом смысл?
Какой смысл пытаться делать бред, который кем-то больным на всю голову предлагается?

Автор: zzkoderzzzx 16.10.2013, 14:02
Получается, что в классе окружности не вводится никаких дополнительных данных, добавляются только методы. 
Т.е. с точки зрения данных отрезок и окружность это одно и то же. 
Может быть в данном случае наследование вполне удачно?

Добавлено @ 14:12
А может быть надо провести наследование в другую сторону?

Код

class Treugolnik {
//
};
class Storona:public Treugolnik
{
//
};
class Tochka:public Storona
{
//
};


Сторона - это треугоьник, вершины которого на одной прямой. Точка это сторона с совпадающими концами. Значит правило "is a" выполняется

Автор: bems 16.10.2013, 17:23
Цитата(zzkoderzzzx @  16.10.2013,  14:02 Найти цитируемый пост)
Сторона - это треугоьник, вершины которого на одной прямой. Точка это сторона с совпадающими концами.

если доводить до такого абсурда, то можно и наследование прямой от окружности аргументировать бесконечностью радиуса

Автор: akizelokro 16.10.2013, 17:46
Цитата(zzkoderzzzx @  16.10.2013,  11:12 Найти цитируемый пост)
Правильна ли она с точки зрения ООП? 
Вроде как сторона не является точкой, а треугольник стороной, почему тогда они наследуются друг от друга?


Определяется логикой модели. Если.. ля-ля-тополя.. определять множество фигур, чья вершина лежит в некой точке.. ля-ля-тополя.. то можно как бы и так.
Если же ещё сильнее абстрагироваться, то можно и ещё более забубенную логически цельную модель прописать. Но вряд ли это тема для элементарного учебника.

Цитата(zzkoderzzzx @  16.10.2013,  13:19 Найти цитируемый пост)
В том задании предлагается реализовать еще класс круга с наследованием от класса линии. Как это сделать (чтобы не просто унаследоваться, а использовать данные класса-предка)? 

Перейти в неэвклидову геометрию. Хотя тут должна быть окружность, по идее.
А линии могут быть замкнутые, незамкнутые, с радиусами кривизны и так далее.

"Руки, ноги.. Главное - хвост!" smile

Добавлено @ 17:50
Вообще, в той модели.. ну, точка - класс. Сторона - класс, в котором к одной точке добавляется ещё точка (координата), у треугольника к стороне, определяемой по двум координатам, добавляется ещё точка (координата).
Можно и так завертеть.

Добавлено @ 17:51
Если в теме или в учебнике по ООП не упоминается неэвклидова геометрия, это не означает, что мы живём в мире только прямых углов.

Автор: zzkoderzzzx 16.10.2013, 21:02
А что, если нужен класс треугольника в пространстве? 
Т.е. дополнительно надо задать плоскость, в которой лежит треугольник. 
Мне кажется, что надо создать класс плоскости и применить множественное наследование.  
Нужно ли здесь виртуальное наследование?
От какого класса лучше унаследовать класс плоскости?

Код

class Tochka
{
//
};
class Storona:public Tochka
{
//
};
class Ploskost:public Storona //???
{
//
};
class Treugolnik:/*virtual*/ public Ploskost, /*virtual */public Storona
{
//
};


Автор: akizelokro 16.10.2013, 21:56
Видишь ли, в эвклидовой геометрии плоскость, как и треугольник, задаётся тройкой точек. Так что будет уже избыточное описание. А вот точки придётся расписывать с тремя координатами (а не двумя).

И опять всё сводится к логике модели. 
Предположу, что в бесконечном множестве задач Универсума любая логически непротиворечивая модель классов где-то да пригодится (но тут я мистик). А, может быть, и даже алгоритмы без классов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)