我試圖建立一個程序,可以基於總結了一些交易的資產負債表,並在這樣的格式呈現結果:我誤用了繼承嗎?
重要屬性這裏是頂級帳戶(如資產)被分解成子賬戶的一棵樹,只有最低級帳戶(「葉」)跟蹤自己的餘額(更高級別的賬戶餘額及其子賬戶的餘額只總和)。
我去到的方法是使用繼承:
class Account{
string name;
virtual int getBalance() =0; //generic base class has no implementation
virtual void addToBalance(int amount) =0;
};
class ParentAccount : public Account{
vector<Account*> children;
virtual int getBalance() {
int result = 0;
for (int i = 0; i < children.size(); i++)
result += children[i]->getBalance();
return result;
}
virtual void addToBalance(int amount) {
cout << "Error: Cannot modify balance of a parent account" << endl;
exit(1);
}
};
class ChildAccount : public Account{
int balance;
virtual int getBalance() { return balance; }
virtual void addToBalance(int amount) {balance += amount;}
};
的想法是,該賬戶存在在編譯時是不知道,所以必須動態生成的樹賬戶。繼承是在這裏幫助,因爲它可以很容易地生成任意深度的樹結構(ParentAccounts可以有孩子這是ParentAccounts),因爲它可以很容易地使用遞歸實現像getBalance()
功能。
當我嘗試合併派生類所特有的功能時,比如修改餘額(這應該只適用於ChildAccount
對象,因爲ParentAccount
餘額僅由它們的餘額定義兒童)。我的計劃是,像processTransaction(string accountName, int amount)
功能將通過樹狀結構尋找具有正確名稱的帳戶進行搜索,然後在該帳戶調用addToBalance(amount)
(*注意:以下)。由於上面的樹結構只允許我找到Account*
,因此可能需要執行addToBalance(amount)
(如上所述)或dynamic_cast
Account*
至ChildAccount*
,然後再調用addToBalance()
。第一個選項似乎稍微優雅,但它需要我這樣的事實來定義ParentAccount::addToBalance()
(雖然爲錯誤),似乎有點怪我。
我的問題是:是否有一個名字爲這個尷尬,以及解決它的標準方法,還是我只是完全誤用繼承?
*注:我承認有可能是組織的賬戶用於搜索的更有效的方式,但我的首要目標是創建一個程序,它是直觀的解釋和調試。根據我目前的理解水平,這是以計算效率爲代價的(至少在這種情況下)。
調用'addToBalance'時必須出現該錯誤的事實是一個很大的信號,表明您正在使用繼承不正確。 「ParentAccount」顯然不是真正的「賬戶」。 –