Ich habe einen Code, in dem abgeleitete Klassen Funktionen implementieren, die Erweiterungen derselben in Basisklassen sind. Im folgenden Beispiel möchte ich, dass die Funktion do_work
eine Reihe von Aufgaben ausführt. In der abgeleiteten Klasse Derived
enthält die Funktion do_work
die gesamte Arbeit der Basisklasse Base
do_work
Funktion, einschließlich einer zusätzlichen Aufgabe.Der beste Entwurf für eine abgeleitete Klasse, die Funktionen aus einer Basisklasse erweitert
Was ist die eleganteste Art, dies aus Sicht des Software-Designs zu tun? Verwenden Sie OPTION 1
oder verwenden Sie OPTION 2
?
#include <iostream>
class Base
{
public:
virtual void do_work()
{
do_base_task1();
do_base_task2();
}
protected:
void do_base_task1() { std::cout << "Doing base task1" << std::endl; }
void do_base_task2() { std::cout << "Doing base task2" << std::endl; }
};
class Derived : public Base
{
public:
void do_work()
{
// OPTION 1
do_base_task1();
do_base_task2();
// END OF OPTION 1
// OPTION 2
Base::do_work();
// END OF OPTION 2
do_extra_task();
}
protected:
void do_extra_task() { std::cout << "Doing derived task" << std::endl; }
};
int main()
{
Base base;
base.do_work();
Derived derived;
derived.do_work();
return 0;
}
Ich würde Option 2 vorschlagen. Option 1 verstößt gegen das DRY-Prinzip. Sehen Sie sich das [Vorlagenmethodenmuster] (https://en.wikipedia.org/wiki/Template_method_pattern) an. – smkanadl
Ich würde Option 2 bevorzugen, da dies bedeutet, dass Sie 'do_base_task1()' und 'do_base_task2()' private Member-Funktionen statt geschützt - sie sollten nur innerhalb von 'Basis' zugänglich sein, da die abgeleiteten Klassen kein Geschäft haben, sie anzurufen . – ArchbishopOfBanterbury
Mit Option 2 können Sie außerdem die geschützten Methoden privat machen, was bei der Kapselung hilft. – JETM