2

我必须对一些财务应用程序进行编程,我必须在其中表示一个流量表。流可以有 3 种类型:

  • 费用流(只是在某个日期一次性支付)
  • 浮动利率流量(流量取决于稍后确定的利率)
  • 固定利率流量(流量取决于交易完成时确定的利率)

我需要保留全部信息,并且需要表示这些流程的时间表。最初我想使用继承并创建三个类FeeFlow,它们FloatingFlowFixedFlow继承自ICashFlow并实现一些GetFlowType()返回枚举的方法,然后我可以dynamic_cast将对象转换为正确的类型。

那将允许我只有一个vector<IFlow>来代表我的日程安排。

您如何看待这种设计,我是否应该使用三个向量vector<FeeFlow>vector<FloatingFlow>vector<FixedFlow>避免动态转换?

4

4 回答 4

8

为什么你真的需要动态演员表?让你的流子类多态地实现相同的接口,那么就不需要强制转换任何东西了。

如果它们需要非常不同的输入,您可以尝试将不同的输入作为构造函数参数传递,从而清除公共接口。但是,如果你真的不能为它们定义一个通用的接口,也许它们最好实现为独立的类。

于 2010-06-07T10:23:20.023 回答
1

如果您需要对不同类型的流执行的所有操作仅因基础数据而异,我建议使用此类操作扩展 ICashFlow - 然后不需要动态转换。但是,如果这是不可能的,那么我认为这两个选项都可以。如果对基类的一个向量没有其他隐藏需求,我个人会选择具有三个向量的那个。

于 2010-06-07T10:26:56.257 回答
0

我认为策略模式最适合您。

您实现了一个 CashFlow 类,该类包含一个进行处理的 CashFlowStrategy 属性。

我不完全理解流程之间的要求和差异,但这样的事情可能会起作用(meta-c++,无效代码):

class CashFlowStrategy {
  public:
    virtual void ProcessFlow(Account from, Account to);
}

class FixedRateCashFlowStrategy : public CashFlowStrategy {
  public:
    void ProcessFlow(Account from, Account to) { ... }
}

class CashFlow {
  private:
    CashFlowStrategy strategy;
  public:
    CashFlow(CashFlowStrategy &strategy) { this->strategy = strategy; }
    void Process() { this->strategy->ProcessFlow(this->from, this->to); }
}

您只需要std::vector<CashFlow>,如何进行处理的决定隐藏在策略中,因此您不必关心它。

于 2010-06-07T12:00:43.160 回答
0

听起来您有各种时间表和各种类型的存款,它们共同构成了资金流。该解决方案听起来好像一种策略模式可以同时适用于计划和存款行为。虽然,如果你有空间,可能值得考虑一种功能性方法。一个 lambda 表达式会用十分之一的代码为您提供相同的逻辑......

于 2010-06-07T13:00:07.263 回答