关于继承的领域模型问题

时间:2010-06-22 11:16:51

标签: c# domain-driven-design

我需要一些关于建模以下电影领域的建议。我有一个人实体。这个人可以是演员,导演,制片人和作家,而且往往都是。我不想在每个实体中复制数据,因此最好创建一个名为Person的抽象基类,每个Director,Actor和Writer类都继承自该类。当我看下面的测试时,这已经开始闻起来了:

[Test] public void Can_Do_It()
{
   var actor = new Actor("Clint Eastwood");  
   var director = //?? Can new it up as he already exists as actor  }

是否更有可能拥有一个Person Class,然后像Writer这样的类接受一个人的实例,即

  

公共班级作家(人,   string attribute1,string attrribute2)   {...}

4 个答案:

答案 0 :(得分:10)

一个常见的解决方案是引入“角色”的概念(在这种情况下非常合适)。一个人可以是0+电影中的演员,和/或填写导演角色。

这也允许您为角色添加属性,如字符名称,日期等


编辑:

Role类与Person和Movie都有双向关联。

class Role
{
     public Person Contributor { ... } 
     public Movie  Feature { ... }
     public RoleType Activity { ... }
}  

class Person
{
    public List<Role> Contributions { ... }
}        

class Movie
{
    public List<Role> Contributors { ... }
    ...
}

答案 1 :(得分:2)

你可以拥有一个具有人的所有共同细节的具体类Person,然后person类也将拥有一个角色的集合/列表。角色将是Actor,Writer等,他们将拥有所有必要的额外属性+行为。

答案 2 :(得分:1)

您应该为此查看合成而不是基于继承的模型。这种事情的标准设计模式相当标准 - 事实上,我怀疑(没有副本),如果你想要更多的信息,它就是四人帮的设计模式。

答案 3 :(得分:1)

如果你的“角色”是有限的并且可以预先定义(在你的例子中就是这种情况),你可以在Person类上使用一个按位枚举标志。

class Person {
   [Flags]
   public enum EnumRole {
      None = 0,
      Actor,
      Director,
      Producer,
      Writer
   }

   public Person( EnumRole role ) {
      Role = role;
   }

   public EnumRole Role { get; set; }

   public bool CanDo( EnumRole role ) {
      return (Role & role) != EnumRole.None;
   }
}

然后创建具有所需角色的人员:

Person p = new Person(Person.EnumRole.Actor | Person.EnumRole.Director);

...并检查他们是否有必要的角色......

bool canDoIt = p.CanDo(Person.EnumRole.Actor);