b2m wrote:Думал-думал как избавиться от этих функций - никак не придумал. Похоже, это неотъемлемая часть этого метода.
Да, неотъемлимая. Но дело не в том чтобы избавится, а в том чтобы... Ненужный полиморфизм просто. Сбивающий с толку. Но кстати этого можно избежать, если не использовать перегрузку на этих виртуальных методах, то есть давать более подробные названия:
Code: Select all
virtual point_distance(point *p) = 0;
virtual segment_distance(line_segment *s) = 0;
На возможностях API этих классов оно никак не скажется, а вот код методов станет более очевидным.
b2m wrote:А ещё, не нравилась необходимость объявлять все эти виртуальные и по большей части абстрактные distance(point*),distance(line_segment*),... в базовом классе primitive.
А вот это, как раз, как я понял обдумав, офигенная фишка метода. Все эти методы объявляются в базовом как абстрактные, и если добавляя новый примитив мы, где-то в производном классе забыли дописать метод, то мы получим ошибку компиляции. В том же lisp'е, забывчивость приводит к run-time ошибками. Что не очень удобно данном случае. С тегированием будет то же самое. С DoubleDispatch не скажу -- до конца не дочитал, и не знаю чем там дело кончилось.
Ещё один плюс такого подхода -- нет необходимости ни в rtti, ни в тегировании.
Склоняюсь именно к нему.