C# 面向对象编程-基本继承

C# 面向对象编程-基本继承,c#,oop,design-patterns,inheritance,C#,Oop,Design Patterns,Inheritance,我有两种不同类型的发票,一种是针对消费者的,另一种是针对企业的。我创建了一个“Invoice”抽象类,消费者发票和业务发票都继承自该类。消费者发票引用消费者实体,业务发票引用业务实体 现在这很好地工作了,但是当我在context类中有一个“Invoices”集合时,问题就出现了。(基本上包含消费者和商业发票)。我无法获取对“业务”对象或“消费者”对象的引用。(这很有道理……但我只是想知道如何解决这个问题?我想这是一个非常常见的情况?) 我是否只是在名为“GetInvoiceRecipient”的

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

现在这很好地工作了,但是当我在context类中有一个“Invoices”集合时,问题就出现了。(基本上包含消费者和商业发票)。我无法获取对“业务”对象或“消费者”对象的引用。(这很有道理……但我只是想知道如何解决这个问题?我想这是一个非常常见的情况?)


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

您可以创建一个收件人接口,让“Consumer”类和“Business”类实现它

抽象发票将仅与收件人接口“对话”

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


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

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


至于您的继承模型,您可能希望研究组合,因为它通常是一个更灵活的选项。尽管我确信只有两个子类并不重要。

您可以使用LINQ:
var businessInvoices=Invoices.Cast()
。否则,收件人听起来是公平的。这取决于你想做什么。最终目标是什么?对于这样的问题,最好包含简单的示例代码,而不是用文本解释类。但是强制转换的问题是,我必须检查它是否属于特定类型?@Default:对于所有其他类型的发票,这将失败。我想你指的是
.OfType()
,它将过滤发票并仅返回业务发票。尽管如此,他不应该改变自己的逻辑。只要消费者和企业都实现了一个通用的
IRecipient
接口,@user2909756
.OfType()
:)