我需要一些关于建模以下电影领域的建议。我有一个人实体。这个人可以是演员,导演,制片人和作家,而且往往都是。我不想在每个实体中复制数据,因此最好创建一个名为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) {...}
答案 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);