mirror of https://github.com/CGAL/cgal
37 lines
1.8 KiB
Plaintext
37 lines
1.8 KiB
Plaintext
/*!
|
|
|
|
\page chappolyret Polymorphic Return Types
|
|
|
|
\author Stefan Schirra (<TT>stschirr@mpi-sb.mpg.de</TT>)
|
|
|
|
For some geometric operations, the type of the result of the operation
|
|
is not fixed a priori, but depends on the input. Intersection computation
|
|
is a prime example. The standard object-oriented approach to this is defining
|
|
a common base class for all possible result types and returning a reference
|
|
or a pointer to an object of the result type by a reference or pointer to the
|
|
base class. Then all the virtual member functions in the interface of
|
|
the base class can be applied to the result object and the implementation
|
|
corresponding to the actual result type is called. It is hard to define
|
|
appropriate base class interface functions (besides `draw()`).
|
|
|
|
\cgal has chosen a different approach, since \cgal wants to avoid large
|
|
class hierarchies. With the \cgal
|
|
class `Object`, you can fake a common
|
|
base class, see Figure \ref FigObject.
|
|
|
|
\anchor FigObject
|
|
\image html Object.gif "UML class diagram for faked object hierarchies (since 2.2-I-4)."
|
|
|
|
Functions having a polymorphic return type create an object of the actual
|
|
result type and wrap it into an object of type `Object`.
|
|
Refer to the documentation of the
|
|
<A HREF="http://www.cgal.org/Manual/latest/doc_html/cgal_manual/STL_Extension_ref/Class_Object.html">`Object`</A>
|
|
class for more details.
|
|
|
|
An alternative is to use a class handling several output iterators at the same time such as the classes
|
|
<A HREF="http://www.cgal.org/Manual/latest/doc_html/cgal_manual/STL_Extension_ref/Class_Dispatch_output_iterator.html">`Dispatch_output_iterator`</A>
|
|
and
|
|
<A HREF="http://www.cgal.org/Manual/latest/doc_html/cgal_manual/STL_Extension_ref/Class_Dispatch_or_drop_output_iterator.html">`Dispatch_or_drop_output_iterator`</A>.
|
|
|
|
*/
|