Класс дизайн "дилемма" - PullRequest
2 голосов
/ 04 августа 2010

Я никогда не делал правильный дизайн класса, так что терпите меня.

Допустим, у нас есть Project класс. Тогда, скажем, у нас есть класс ProjectGroup, который имеет те же члены, что и класс Project, плюс список Project s.

Должен ли ProjectGroup быть суперклассом Project или ProjectGroup специализацией Project, а первый должен быть подклассом последнего?

Ответы [ 3 ]

2 голосов
/ 04 августа 2010

Звучит так, как будто вам может понадобиться шаблон Composite.И LeafProject, и CompositeProject реализуют интерфейс Project, и CompositeProject также содержит коллекцию экземпляров Project.

2 голосов
/ 04 августа 2010

Я не буду беспокоить вас теорией , потому что вы, вероятно, спешите получить быстрый ответ.Итак, вот так:

Если два ваших класса на самом деле подразумевают, что они должны быть связаны наследованием, тогда ProjectGroup должно наследоваться от Project класса.Вот как это будет выглядеть в C #:

public class ProjectGroup: Project ...

Если это не так, но они используют некоторые общие члены класса (которые определяют их состояние и некоторые функции над этим состоянием), то я бы написалинтерфейс и реализовать его в обоих классах.Код C # снова:

public interface ICommonState ...

public class Project: ICommonState ...

public class ProjectGroup: ICommonState
{
    IEnumerable<ICommonState> projects
    ...
}

Редактировать

Если ваши классы на самом деле Project и ProjectGroup, и они оба имеют общие свойства, например ID и Name (например,), они все еще не должны быть унаследованы.У них просто есть свойства с одинаковыми именами, но в основном это разные сущности.

Они оба могут

  • реализовать интерфейс ICommonEntity - использовать его, когда у них естьто же состояние + функциональность, но функциональность ведет себя по-разному в каждом из них
  • наследуется от CommonEntity класса - используйте его, когда функциональность полностью идентична;таким образом вы будете следовать философии DRY (не повторяйтесь)

Таким образом, ваш компонент может быть интерфейсом или классом (при использовании составного шаблона).

Прямое наследование между двумя классами больше подходит, когда сущности подразумевают связь друг с другом.Как User и Person классы.Они могут быть унаследованы в любом случае.В зависимости от бизнес-сценария.

class User: Person  

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

class Person: User  

Это будет веб-сайт, где вы можете зарегистрироваться как пользователь.В случае, если вы заполняете некоторые личные данные, ваши пользовательские данные становятся типа Person.

0 голосов
/ 04 августа 2010

, если список участников проектов уникален для projectgroup и не применяется ко всем типам проектов, то сделайте проект своим супер / базовым классом и выведите проектную группу из проекта.

...