Как я уже упоминал в предыдущем вопросе, я занимаюсь рефакторингом проекта, над которым я работаю. Прямо сейчас все зависит от всего остального. Все разделено на пространства имен, которые я создал ранее, но я не думаю, что мой метод разделения был очень хорошим. Я пытаюсь исключить случаи, когда объект зависит от другого объекта в другом пространстве имен, которое зависит от другого объекта.
Я делаю это, разбивая свой проект (игру) на несколько сборок:
GameName.Engine
GameName.Rules
GameName.Content
GameName.Gui
Сборка GameName.Engine
содержит несколько интерфейсов, поэтому другие части программы не должны зависеть от какой-либо конкретной реализации. Например, у меня есть интерфейс GameName.Engine.ICarryable
, который в основном реализован классом GameName.Content.Item
(и его подклассами). У меня также есть объект, позволяющий Actor
подобрать ICarryable
: PickupAction
. Previously
, для этого требовался предмет, но это раскрывает ненужные методы и свойства, где на самом деле нужны были только методы, необходимые для его поднятия и переноса. Вот почему я создал интерфейс ICarryable
.
Теперь все хорошо, так что на мой вопрос. GameName.Gui
должен зависеть только от GameName.Engine
, а не от какой-либо реализации. Внутри GameName.Gui
у меня есть MapView
объект, который отображает Map
и любые IRenderable
объекты на нем.
IRenderable
- это просто интерфейс, который предоставляет изображение и некоторые строки, описывающие объект. Но для MapView также необходим объект для реализации ILocateable
, поэтому он может видеть свое местоположение и знать, когда он изменяется с помощью события LocationChanged
, внутри ILocateable
.
Эти два интерфейса реализуются как объектами Item
, так и Actor
. Которые, опять же, определены в GameName.Content
. Поскольку нужны оба интерфейса, у меня есть два варианта:
Заставьте GameName.Gui
зависеть от GameName.Content
и потребовать Entity
(базовый класс Item
и Actor
).
Создайте интерфейс внутри GameName.Engine
, который выглядит следующим образом:
interface ILocateableRenderable : ILocateable, IRenderable
{
}
А затем заставьте мои объекты Actor
и Item
реализовать этот интерфейс вместо двух по отдельности.
У кого-нибудь есть предложения, какой метод лучше? Уместно ли создавать интерфейс без методов или свойств, который обеспечивает реализацию только двух других интерфейсов?
Пояснение: MapView
работает на Map
, который состоит из Entity
объектов. Я не хочу открывать Entity
объекты для MapView
, нужно только знать их местоположение (ILocateable
) и как их визуализировать (IRenderable
).