问题
I have a class CGrandMother
having a public method virtual bool Compute()
that does
virtual bool Compute()
{
return false;
}
From CGrandMother
derives publicly CMother
which does not implement Compute
. Now from CMother
derive publicly C1
and C2
that do implement virtual bool Compute()
. Now virtual bool C1::Compute()
and virtual bool C2::Compute()
respectively do a lot of stuff proper to respectively C1
and to C2
, but also a lot of identical stuff proper to CMother
. Now there's a class CFamily
having as member a pointer to CMother
and almost everywhere in the code Compute
is called through lines of the form
ptrCMother->Compute();
How could I factor out the common stuff related to CMother
done in C1
and C2
so that I wouldn't have to change all those ptrCMother->Compute();
lines ?
回答1:
The answer should be pretty straightforward. You said "a lot of identical stuff proper to CMother". So you should factor them out into a member function of CMother. Since it appears that the functionality is needed only by classes derived from CMother, you should mark the new member function "protected". What @0x5453 said is one way; but I'd suggest a new function, so as to leave the public method CMother::Compute alone. There could be another child class of CMother that does not implement Compute and relies on CMother::Compute to do certain things.
来源:https://stackoverflow.com/questions/40043292/best-way-to-refactor-class-hierarchy