【发布时间】:2016-08-30 01:06:53
【问题描述】:
我有一个代码,其中派生类实现的函数是基类中相同的扩展。在下面的示例中,我希望函数 do_work 执行一系列任务。在派生类Derived中,do_work函数包含了基类Basedo_work函数的所有工作,包括一项额外的任务。
从软件设计的角度来看,最优雅的方式是什么?使用OPTION 1 还是使用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;
}
【问题讨论】:
-
我建议选项 2。选项 1 违反了 DRY 原则。看看Template method pattern。
-
我更喜欢选项 2,因为这意味着您可以创建
do_base_task1()和do_base_task2()私有成员函数而不是受保护的 - 它们只能从Base中访问,因为派生类没有企业打电话给他们。 -
此外,选项 2 允许您将受保护的方法设为私有,这有助于封装。
-
@smkanadl 这怎么违反它?请解释一下。
-
只要派生类中的所有任务都在基本任务之后,我肯定也会选择选项 2。我最近遇到了类似的问题,我基本上不得不像
do_base_task1()、do_extra_task()和do_base_task2()这样的东西。在那里我选择了选项 1,因为我没有看到另一种直接的方法。
标签: c++ class oop inheritance