簡體   English   中英

避免使用C ++派生類重復代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM