«Множественность реализации» - как с этим бороться? И как называется эта вещь? - PullRequest
0 голосов
/ 22 августа 2011

Мой вопрос немного о методах программирования или, может быть, шаблонах проектирования. Предположим, что несколько классов, полученных из base, содержат чистый виртуальный метод, который должен выполнять некоторые взаимодействия между ними.

Например, Rectangle, Ellipse, Triangle и Line - все они получены из Shape. И этот абстрактный класс Shape содержит virtual bool Intersects(Shape* another) = 0.

Кажется, , что мне нужно сделать шесть реализаций, верно (кстати, есть ли лучшее решение в этом конкретном примере?).

На данный момент я не имею представления о других примерах.

Может быть, я говорю о вещи, которая хорошо известна, и я почти уверен, что есть некоторые имена, описывающие технику. Однако я даже не знаю, что ввести, чтобы найти его в Интернете.

Хорошо, вы можете сказать мне, как реализовать такую ​​вещь (мне все еще интересно, нужен ли какой-нибудь вспомогательный метод, или, может быть, RTII 'dynamic_cast?) Или указать некоторые источники (искусство, учебные пособия или что угодно) об этом?

Ответы [ 2 ]

5 голосов
/ 22 августа 2011

Это пример двойной отправки в школьной книге, статья в Википедии дает хорошее описание проблемы и решения:

http://en.wikipedia.org/wiki/Double_dispatch

Если я правильно помню, есть очень элегантныйРешение проблемы в книге Андрея Александеску «Современный дизайн C ++»

http://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315

1 голос
/ 22 августа 2011

Простой факт заключается в том, что вы используете наследование неправильно.Вместо того, чтобы иметь тип наследования Line, Box, Triangle, вы должны иметь VertexShape, который представляет все фигуры, которые состоят из серии вершин, и FormulaShape, который представляет все фигуры, которые описываются математическими формулами.1002 * Наследование не должно использоваться для моделирования отношений, которые можно смоделировать, просто изменяя данные, которые должны присутствовать в классе независимо от того, например, вершин, используемых для построения многоугольника.

Редактировать: Нет, нетнет.Используйте шаблон .Специализируйте его, если вы в отчаянии.Вот для чего это.Предоставить универсальные алгоритмы с нулевыми накладными расходами.Мы обнаружили это в 90-х годах, ребята.

...