【问题标题】:OO Programming - Basic InheritanceOO 编程 - 基本继承
【发布时间】:2013-10-31 10:35:21
【问题描述】:

我有两种不同类型的发票,一种是针对消费者的,另一种是针对企业的。我创建了一个“Invoice”抽象类,Consumer 和 Business 发票都继承自该类。消费者发票引用消费者实体,商业发票引用商业实体。

现在这很完美,但是当我在上下文类中有一组“发票”时,问题就出现了。 (其中基本上包含消费者和企业发票)。我无法获得对“业务”对象或“消费者”对象的引用。 (完全有道理......但我只是想知道我如何解决这个问题?我想这是一个很常见的场景?)

我是否只是在名为“GetInvoiceRecipient”的抽象类中创建一个返回“Recipient”对象的新方法?不过,此解决方案的唯一问题是现在我无法检索给定消费者或给定企业的发票?

【问题讨论】:

  • 您可以使用 LINQ:var businessInvoices = Invoices.Cast<BusinessInvoice>()。否则,收件人听起来很公平。这有点取决于你想做什么。最终目标是什么?
  • 对于这样的问题,最好包含简单的示例代码,而不是用文字解释你的类。
  • 转换的问题是我必须检查它是否属于特定类型?
  • @Default:对于所有其他类型的发票都将失败。我认为您的意思是.OfType<BusinessInvoice>(),它将过滤发票并仅返回商业发票。不过,他不应该分叉他的逻辑。 Recipient 方法是有意义的,只要消费者和企业都实现一个通用的 IRecipient 接口。
  • @user2909756 .OfType<BusinessInvoice>() :)

标签: c# oop design-patterns inheritance


【解决方案1】:

您可以只创建一个接收者接口并让“消费者”类和“业务”类实现它。

抽象发票将仅与收件人界面“对话”。

Recipient 接口将具有称为 getName、getEmail 或任何您需要的方法。您必须在 Consumer 和 Business 类中重新定义此方法。

这是一个简单的解决方案,但还有很多其他解决方案。

【讨论】:

    【解决方案2】:

    我倾向于在这种情况下使用管理类。也就是说,一个包含一个字典的类,其中包含一堆类,无论是 Consumer、Business 还是实现 IInvoice 接口的类。管理类可以有像 Add(IInvoice, key) 和 Lookup(key) as IInvoice 这样的公共方法

    至于您的继承模型,您可能需要考虑组合,因为它通常是一个更灵活的选择。 What is composition as it relates to object oriented design? 虽然我确信只有两个子类没关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2015-05-24
      • 2016-12-12
      相关资源
      最近更新 更多