2010-06-22 3 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, которые принимают в экземпляре человека т.е.

общественный класс Writer (Person человек, строка attribute1, строка attrribute2) {...}

ответ

1

Вы должны смотреть на состав, а не модели, основанной на наследство для этого. Довольно стандартный шаблон дизайна для такого рода вещей - на самом деле, я подозреваю (у меня нет копии), что он находится в книге шаблонов моделей Gang of Four, если вы хотите получить дополнительную информацию.

+0

Спасибо за ответ - от того, что Я теперь видел, что мой код будет читать: var person = new Person ("Clint Eastwood") var actor = new Актер (p erson); var director = new Директор (лицо); ? – Chev

10

Общим решением было бы ввести понятие «роль» (вполне подходящее в данном случае). Человек может быть актером в фильмах 0+ и/или заполнять роль директора.

Это также позволяет добавлять атрибуты роли, как символьное имя, дату и т.д.


Edit:

Класс роли будет иметь 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

Спасибо, спасибо за ответ. Как выглядят классы для Лица и Актера? – Chev

+0

@Chev: класс будет иметь свойство типа коллекции ролей ... возможно: Список Роли –

+0

@Chev: см. Редактировать. Актер может быть классом (класс Актер: Роль) или просто значением перечисления RoleType. –

2

Вы могли бы иметь конкретный класс Person со всеми общими деталями лица, а затем класс человек будет также сбор/список ролей. Ролями будут Actor, Writer и т. Д., И они будут иметь все необходимые дополнительные атрибуты + поведение.

+0

спасибо за ответ. Вы видите роли в качестве конкретных классов? – Chev

+0

Я думал о конкретных классах, потому что таким образом они могут хранить дополнительную информацию и инкапсулировать какое-то поведение. – Grzenio

1

Если ваши «роли» конечны и могут быть определены заранее (как кажется в вашем примере), вы можете использовать побитовый флаг enum в классе 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); 
Смежные вопросы