OOP - 以Person为基础建模Client和Employees类

Ski*_*les 0 c# oop fluent-nhibernate

抱歉,如果已经问过这个问题但是,我看了一眼,找不到任何东西.我试图找出在C#中模拟以下内容的最佳方法.我勾勒出了一些想法,但没有一个感觉正确.

我创建了一个抽象的'Person'类.我的应用程序将拥有客户和员工.显然,客户是个人员工是个人

  • 员工不一定是客户.
  • 即使客户最初没有设置为员工,客户也可以成为员工.
  • 员工可以成为客户
  • 一个人可以不再是员工,但仍然是客户
  • 一个人可以不再是客户,但仍然是员工

最后,我想使用Fluent NHibernate进行映射.我一直认为这应该很简单,我只是不直接思考,但是我可以使用哪种模式来解决这个问题.

谢谢.

cle*_*tus 11

您的问题是您的第一个前提:客户不是人(也不是员工).正如你所猜测的那样,一个人既可以是一个人,也可以是两个人.所以这不是你想要的"is-a"(继承)关系,它是一个"has-a"(组合)关联.

我们在这方面没有得到帮助,因为你所描述的是一个典型的例子,当我们在大学里学习OO编程,阅读书籍等时,我们会被教导,而且它不是一个好的模型.

一个人具有零个或多个角色.角色可以是客户,供应商,员工,经理或其他任何人.

如果您遵循该模型,您将获得更灵活(更准确)的内容.

我在这里描述的内容在CRM系统中非常常见,并且往往被称为Party系统.一般的想法是:

  • 缔约方是一个人或一群人的关键实体;
  • Partieis有两种(或更多种)亚型:人和组织很常见;
  • 一方有零个或多个角色;
  • 有时候缔约方彼此相关,但更典型的是角色彼此相关.

例:

  • 乔史密斯是一个人,是党的一个子类型;
  • Acme Corp是一个组织,是党的子类型;
  • Joe Smith扮演员工的角色;
  • Acme Corp扮演雇主的角色;
  • Joe the Employee和Acme the Employer之间存在角色雇佣关系(一种角色关系).

这个主题有很多变化.

  • +1很好地了解它不是一个很好的教学模式("has-a","is-a"有时会有些误导).GoF:"首选组合而不是继承".另一种看待它的方法是,如果继承没有任何意义,或者以某种方式打破模型而不是组合.:) (2认同)