我正在尝试建立一个程序,该程序可以根据对许多交易的总和生成资产负债表,并以如下格式显示结果:
这里的重要属性是顶级账户(如 Assets)被分解为子账户树,只有最低级账户(“叶子”)跟踪自己的余额(更高级别账户的余额为只是他们子账户余额的总和)。
我的首选方法是使用继承:
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*
to a 。第一个选项似乎稍微优雅一些,但事实上它需要我定义ChildAccount*
addToBalance()
ParentAccount::addToBalance()
(尽管是一个错误)对我来说似乎有点奇怪。
我的问题是:这种尴尬是否有一个名称,以及解决它的标准方法,还是我完全误用了继承?
*注意:我认识到可能有一种更有效的方法来组织帐户以进行搜索,但我的主要目标是创建一个易于解释和调试的程序。根据我目前的理解水平,这是以计算效率为代价的(至少在这种情况下)。