【发布时间】:2008-10-16 07:54:51
【问题描述】:
正如我在之前的问题中提到的,我正在重构我正在处理的项目。现在,一切都取决于其他一切。一切都被分离到我早期创建的命名空间中,但我认为我的分离方法不是很好。我试图消除一个对象依赖于不同命名空间中的另一个对象的情况,该命名空间又依赖于另一个对象。
我这样做的方式是将我的项目(游戏)划分为几个程序集:
GameName.Engine
GameName.Rules
GameName.Content
GameName.Gui
GameName.Engine 程序集包含一堆接口,因此程序的其他部分不需要依赖任何特定的实现。例如,我有一个GameName.Engine.ICarryable 接口,它主要由GameName.Content.Item 类(及其子类)实现。我还有一个对象可以让Actor 接收ICarryable:PickupAction。 Previously,它需要一个 Item,但这暴露了不必要的方法和属性,它实际上只需要拾取并携带它所需的方法。这就是我创建ICarryable 接口的原因。
现在这一切都很好,所以我的问题。 GameName.Gui 应该只依赖于GameName.Engine,而不是任何实现。在GameName.Gui 内部,我有一个MapView 对象,它显示Map 和上面的任何IRenderable 对象。
IRenderable 基本上只是一个公开图像和一些描述对象的字符串的接口。但是,MapView 还需要对象实现ILocateable,因此它可以通过ILocateable 内部的事件LocationChanged 看到它的位置并知道它何时被更改。
这两个接口由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)。
【问题讨论】: