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,例如实现 IEffect
的 Effect1
,方法 Activate
使用 class A
。为此,Effect1
的构造函数方法接受 class A
.
的实例
当我创建 ItemList
时,它包含一些使用 Effect1
或 Effect2
、EffectN
的 Item
。但是 class A
需要 ItemList
和 Effect1
需要 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
时,将 this
或 Class A
的实例传递到 IEffect
接口的方法中.这将允许您在 Class Effect
、Class Effect1
、Class Effect2
等内部调用 Class A
的方法,而无需循环依赖。
不要将 Class A
存储在您的 Class Effect
中。
我想定义一个表示项目的基础 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,例如实现 IEffect
的 Effect1
,方法 Activate
使用 class A
。为此,Effect1
的构造函数方法接受 class A
.
当我创建 ItemList
时,它包含一些使用 Effect1
或 Effect2
、EffectN
的 Item
。但是 class A
需要 ItemList
和 Effect1
需要 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
时,将 this
或 Class A
的实例传递到 IEffect
接口的方法中.这将允许您在 Class Effect
、Class Effect1
、Class Effect2
等内部调用 Class A
的方法,而无需循环依赖。
不要将 Class A
存储在您的 Class Effect
中。