2010-06-22 118 views
2

我需要一些關於建模以下電影域的建議。我有一個人實體。這個人可以是演員,導演,製片人和作家,通常都是。我不想在每個實體中複製數據,因此最好創建一個名爲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類,然後有像Writer類是需要在人的實例,即

公共類作家(人的人, 串ATTRIBUTE1,串attrribute2) {...}

回答

1

你應該看看的組成,而不是基於繼承模型這一點。這種事情的公平標準設計模式 - 事實上,我懷疑(沒有副本),它是在四人幫設計模式書,如果你想要更多的信息。

+0

感謝您的答覆 - 從什麼我現在看到我的代碼會顯示爲: var person = new Person(「Clint Eastwood」) var actor = new Actor(p erson); var director = new Director(person); ? – Chev 2010-06-22 11:59:47

10

一個常見的解決方案是引入'角色'的概念(在這種情況下非常合適)。一個人可以成爲0+電影中的演員,和/或填寫導演角色。

這也可以讓你的屬性添加到角色中,像字符的名稱,日期等


編輯:

角色類將有兩個人及電影2路關聯。

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

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

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

感謝henk的回覆。對於Person和Actor,類會是什麼樣子? – Chev 2010-06-22 11:41:01

+0

@Chev:該類將具有角色集合類型的屬性...可能:列表角色 – 2010-06-22 12:08:51

+0

@Chev:請參閱編輯。 Actor可以是一個類(類Actor:Role)或只是一個RoleType枚舉的值。 – 2010-06-22 12:56:19

2

你可以有一個具體的類人用一個人的所有常見的詳細信息,然後這個人類也將有角色的集合/列表。角色可以是Actor,Writer等,他們將擁有所有必要的額外屬性+行爲。

+0

感謝您的回覆您是否看到具體類是列的角色? – Chev 2010-06-26 08:05:19

+0

我在考慮具體類,因爲這樣他們可以存儲額外的信息並封裝一些行爲。 – Grzenio 2010-06-26 11:46:49

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);