Re: Policy-based class design or inheritance?
On 30 Set, 20:59, "Martin T." <0xCDCDC...@gmx.at> wrote:
Vincent wrote:
Hi all,
suppose we can choose between two approaches:
1) First approach (policy-based class design)
template <typename OutputPolicy>
class A {
...
public:
void print() {
OutputPolicy::print("...");
}
};
(...)
2) Second approach (classic inheritance)
class A {
...
public:
virtual void print() = 0;
}
(...)
Instinctively I tend toward the first approach. Inheritance is
undoubtedly a "pillar" of object-oriented programming, but if possible
I always look for an alternative design. (Inheritance introduces
issues not always obvious: it's really an "is a" model? the base class
should be made abstract? the polymorphic use of the class should be
allowed? the inheritance should be of interface or of implementation?
and so on.)
What alternative do you prefer?
Well. If you need polymorphic, that is use type A somewhere where you do
not want/can use A as a template, you're stuck with solution #2, yes?
Yes.
If, on the other hand, A is only ever used as the concrete type A<X> or
you can templatize the user code, then #1 looks very compelling.
Yes, I agree. Personally, I find the policy-based design clear and
elegant. It is also relatively simple, while, IMO, the concept of
"inheritance" require a-not-so-trivial-to-obtain experience (trials
and errors).
Personally, I would never use #1 if there are no strong reasons why #2
is clearly worse, because at my current environment it would just
confuse people.
In my opinion solution #2 is not so bad, but #1 is better. Why?
Because it is clear, elegant and not error prone (no need to think of
virtual tables, pure virtual functions, polymorphism, and so on).
What do you think?
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]