【发布时间】:2010-07-20 20:58:53
【问题描述】:
假设我有一个用于宠物商店的 C++ 应用程序,该应用程序刚开始使用 Cats。该应用程序有一个类可以对 Cat 对话框进行一些数据处理:
CatDlg.cpp:
CatDlg::CatDlg() {//ctor stuff}
CatDlg::onInitDialog() {
DBAccess db;
db.open();
CatRec cat;
cat = db.findRec(m_catID);
CString name = cat.getName();
NameField.SetWindowText(name);
// other catty dialogy stuff
}
现在店主想要将 Dogs 添加到应用程序中。狗数据本质上与猫数据相同,只是数据类型不同。我可以复制 CatDlg 类,更改一些类型并以这种方式处理它,但这会导致维护问题和 99% 重复代码的代码膨胀:
DogDlg.cpp:
DogDlg::onInitDialog() {
DBAccess db;
db.open();
DogRec dog;
dog = db.findRec(m_dogID);
CString name = dog.getName();
NameField.SetWindowText(name);
// other doggy dialogy stuff
}
或者,我可以更改对话框类以处理多个动物,方法是传入一个指示动物类型的标志,然后相应地处理它。随着所有者添加新动物,这也变得更加丑陋,因为方法变得更长,有很多重复的代码块:
AnimalDlg.cpp:
AnimalDlg::onInitDialog(AnimalType type) {
DBAccess db;
db.open();
if(type == CAT)
{
CatRec cat;
cat = db.findRec(m_catID);
CString name = cat.getName();
}
else if(type == DOG)
{
DogRec dog;
dog = db.findRec(m_dogID);
CString name = dog.getName();
}
NameField.SetWindowText(name);
}
重构类以使其更通用的最佳方法是什么?有我可以应用的设计模式吗?有没有办法将通用代码拉入基类,然后制作特定于动物的子类?我快速浏览了 Fowler 关于重构的书,但没有任何反应。
假设类中有更多代码,目前特定于 Cat 类型,但适用于任何类型的动物。
感谢您的帮助!
菲利普
【问题讨论】:
-
多态性?虚函数?
-
您使用的是什么 GUI 工具包,还是有待决定?