我试图建立一个程序,可以基于总结了一些交易的资产负债表,并在这样的格式呈现结果:我误用了继承吗?
重要属性这里是顶级帐户(如资产)被分解成子账户的一棵树,只有最低级帐户(“叶”)跟踪自己的余额(更高级别的账户余额及其子账户的余额只总和)。
我去到的方法是使用继承:
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”显然不是真正的“账户”。 –