Re: pure virtual function with unspecified parameters?
* Markus Dehmann:
I have an abstract base class called Data. It has a pure virtual
function
virtual void write(std::ostream& out) =0;
which writes the internal data to a stream. Now the problem is that
this is not appropriate for some implementations of the class. Some
implementations have an internal representation that they should
rather write into several separate files. So for those, something like
this would be more appropriate:
void write(const std::string& outputDirectoryName);
What would be a good design for the abstract base class in this case?
It seems like it should require some kind of write function, but with
flexible parameter lists for different implementations.
Certainly we don't want to deal with void pointers:
write(void* toWhatever) = 0;
that the implementation classes would cast and use however they like
because void pointers are evil.
A template also doesn't work:
template<class T>
virtual void write(T& out) = 0;
because you can't template a virtual function. And it would seem like
overkill to template the whole class on this output parameter; after
all it's just a little write function within a much larger class.
What would be a good design in this case?
The point of std::ostream as an abstract streaming interface is to
separate the data generation from the particulars of where that data
ends up (if anywhere) -- file, http-connection, zip, memory buffer...
So you have the right idea in the abstract Data class.
Just provide more specific additional interfaces lower in the hierarchy,
and implement the streaming-to-std::ostream as e.g. XML representation.
If this is impossible, then you have a design error, derived classes
that /are not/ substitutible for the abstract base class, and then you
need to redesign (it does sound as if you have committed the grave sin
of introducing an UBC, a Universal Base Class, the ultimate horror, oten
reflected in meaningless names such as "Data" or "Manager" or "Object").
Above all, think about the knowledge and responsibility distribution of
the system: divide knowledge and responsibility in a clean manner.
Cheers, & hth.,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?