【发布时间】:2014-09-18 17:34:31
【问题描述】:
我正在尝试为我正在编写的程序实现良好的设计模式。我有这样的类结构。
abstract class SomeBase
{
public SomeObject obj { get; protected set; }
protected SomeBase(SomeObject x)
{
obj = x;
}
//Other methods and fields...
}
public class SomeDerived : SomeBase
{
public SomeDerived() : base(new SomeObject(this))
{
}
}
现在我确定你知道,你不能在基础构造函数中传递它,因为此时对象还没有被初始化。无论如何,我真的希望有一个解决方法。让SomeDerived() 处理基类字段的设置对我来说不是最佳做法。我想将这个新对象向上传递。
【问题讨论】:
-
其他子类是否想创建一个不引用
this的SomeObject实例?如果没有,只需将该逻辑放入SomeBase构造函数主体中:obj = new SomeObject(this); -
你为什么要这个?我看不出有必要。
-
嗯,我确实认为我所做的很有用。所以,我有一个在游戏中工作的 StateMachine。有一个包含 3 种不同类型的状态(操作、大小、漏洞)的 StateManager 类。州需要有能力更新其他州并替换自己(我的教授的要求)。
-
所以...状态需要引用它们改变的游戏对象。 StateManagers 也持有这个引用,因此他们可以将它传递给他们初始化的适当状态。问题在于 GameObject 构造函数传递了“GameObject2D(...) : base(new StackManager(this))”
-
我有一个解决方法,但这并不理想,因为 GameObject2D 的每个派生类都需要初始化它们的 StateManager。乔恩,作为对你的回答,只有与国家有关的事情才需要。其中大部分是游戏对象,唯一的例外可能是游戏或菜单是否具有状态逻辑(可能)。
标签: c# constructor abstract-class derived-class base-class