OOP 的循环依赖

Circular Dependency on OOP

我想定义一个表示项目的基础 class。每个项目都有一个可以激活的效果。效果是一个接口 IEffect 有一个 Active 方法,而 Item class 有一个 IEffect 属性.

示例:

public interface IEffect
{
    void Activate();
}

public class Item
{
    private IEffect mEffect;
}

现在我定义了一个名为 ItemList 的 class,它包含一个项目列表和所选项目的当前位置,以及另一种操作列表的方法。

public class ItemList
{
    private int mCurrentPos;
    private List<Item> ...
    ... some methods ...
}

此 class 从另一个 class (例如 class A)中使用,它更新位置并操作列表。我想创建一个 Effect class,例如实现 IEffectEffect1,方法 Activate 使用 class A。为此,Effect1 的构造函数方法接受 class A.

的实例

当我创建 ItemList 时,它包含一些使用 Effect1Effect2EffectNItem。但是 class A 需要 ItemListEffect1 需要 A,但是我不能创建没有 [=18= 的 ItemList ],等等...

更新的答案

根据您的评论,您的代码中似乎存在耦合问题。看看这个网站 Game Programming Patterns 了解如何正确地设计你的游戏模式,这样你就不会陷入这种情况。

编辑:添加额外的 Design Patterns, Wikipedia Link to Design Patterns 这可能有助于解决此类情况。

有时在创建游戏系统交互等复杂系统时,需要您重新考虑最初创建系统的方式,也可能需要从头开始完全重写整个系统。学习专业游戏开发人员使用的设计模式(第一个 link)和学习适用于所有 OOP 编程语言的设计模式(第二个 link)将确保您创建的设计可以防止您进入问题中的一种情况。

原始答案

不要使用构造函数来跟踪 class A,而是修改您的方法以在 IEffect 界面中接受 class A 作为 parameter/argument。

public interface IEffect
{
    void Activate(A instance);
}

当您在 Class A 中遍历 ItemList 时,将 thisClass A 的实例传递到 IEffect 接口的方法中.这将允许您在 Class EffectClass Effect1Class Effect2 等内部调用 Class A 的方法,而无需循环依赖。

不要将 Class A 存储在您的 Class Effect 中。