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

时间:2009-11-08 06:04:07

标签: c# oop fluent-nhibernate

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:11)

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

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

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

如果您遵循该模型,您最终会得到更灵活(更准确)的内容。

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

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

示例:

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

这个主题有很多变化。

答案 1 :(得分:0)

感谢您的回复,这真的有助于让我的头脑清醒。我试图根据你的建议对我的要求进行建模,所以这是我在模型上的第一次传递。

我把它放在这里有两个原因;

  1. 我确定如果我问这个问题,其他人会有同样的问题,所以这可能会有所帮助,或者成为他们的起点。
  2. 我愿意接受反馈,并建议我如何更好地建模,以确保它既“灵活”又“准确”

    public class Parties {
        Person Person {get; set;}
        Organization Organisation {get; set;}
        public Parties(Person person, Organization organisation) {
            Person = person;
            Organisation = organisation;
        }
    }
    
    public interface Person {}
    public interface Organization {}
    
    public class Business : Organization {}
    
    public class Contact: Person {
        public string FirstName{get; set;}
        public string LastName {get; set;}
        List<Role>roles = new List<Role>();
            public Contact() {}
            public Contact(Clients client)
                : this() {
                roles.Add(client); 
            }
            public Contact(Employees employee)
                : this() {
                roles.Add(employee); 
            }
        }
    
    public interface Role {}
    
    public interface Clients: Role{}
    public class BronzeClient: Clients{
        public DateTime lastClass {get; set;}
    }
    public class SilverClient : Clients {
        public DateTime lastClass {get; set;}
    }
    public class GoldClient : Clients {
        public DateTime lastClass {get; set;}
    }
    
    public interface Employees : Role {}
    public class Employee: Employees{
        public string EmployeeID{ get; set;}
    }
    public class SeniorManager : Employees {
        public string EmployeeID {get; set;}
    }