[英]Avoiding repeated code with C++ derived classes
我正在編寫兩個程序,比方說一個計算器和一個國際象棋游戲。 他們共享許多代碼(界面管理,文件打開/保存),而我正在嘗試找出避免重復代碼的最佳實踐。
我的想法是創建一個父類,將其稱為Generic_Program,它具有所有常用功能,並派生子類。
我遇到的問題是如何調用派生類的函數而不是父類的函數。 保存配置並退出的示例:
class Generic_Program {
void SaveConfig() {
// Write general parameters to a file
}
void Exit() {
SaveConfig(); //First save configuration
// Configuration saved, do exit routines, like make window invisible, etc.
}
}
class Calculator : Generic_Program {
void SaveConfig() {
Generic_Program::SaveConfig(); //Write generic parameters
// Write calculator-specific data, like calculation results, etc.
}
}
class Chess : Generic_Program {
void SaveConfig() {
Generic_Program::SaveConfig(); //Write generic parameters
// Write chess-specific data, like player scores, etc.
}
}
現在,我希望能夠從兩個程序中調用Exit()
。 期望的行為是它們都保存其通用數據和特定數據,然后退出。
如果使用上面的代碼執行此操作,它將調用父類的SaveConfig(),因此將僅保存通用程序數據。
我當然可以為子類編寫特定的Exit()
例程,但重點是只編寫一次共享代碼。
有沒有一種方法可以從父類中調用SaveConfig()
? 還是在這種情況下避免重復代碼的最佳實踐?
通常,您將調用子對象的退出例程,而該退出例程將調用基本退出例程。
Calculator::exit() {
GenericProgram::exit();
std::cout << "do Chess configs" << std::endl;
// if needed can call parent routine again, GenericProgram::finish_configs();
}
如果要調用基礎對象的Exit例程並讓其調用子對象的Exit。 在基礎對象中聲明一個虛擬ExitSub例程。
virtual void GenericProgram::ExitSub();
並聲明/定義默認版本,以防基礎對象被調用但尚未實例化任何子對象。
Generic_Program::ExitSub() { // do nothing };
並為每個子對象聲明/定義一個版本,例如:
Chess::ExitSub() {
std::cout << "do chess configs" << std::cout;
}
在Generic_Program中聲明/定義一個Exit例程,該例程調用子對象ExitSub例程。 (這是多態性)。
Generic_Program::Exit() {
SaveConfig(); // First save configuration
ExitSub(); // invoke sub object configuration
}
然后從基礎對象調用退出例程
MyGenericProgram.Exit();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.