2

在构建类结构时,我希望派生类可能拥有派生成员类。例如:

class GamePiece
{ 
}
class Checker : GamePiece
{}
class ChessMan : GamePiece
{}

class Game 
{
   protected GamePiece _piece;
}

class Checkers : Game
{
   Checkers(){ _piece = new Checker(); }
}
class Chess : Game
{
   Chess(){_piece = new ChessMan();}
}

这被严重地过度简化了,但确实说明了这一点。现在假设有事件等,我想在基类构造函数中附加公共事件,在派生构造函数中附加专用事件。例如,棋子和棋子都可能具有“捕获”事件和“移动”事件。我想将它们附加到基本构造函数中。但是,诸如“castled”之类的特定事件将仅附加在特定构造函数中。

我遇到的问题是基本构造函数似乎只能在派生构造函数之前运行。我如何实现这一点,以便在调用基本“游戏”构造函数以附加到事件之前实际实例化“游戏部件”。

我的直觉表明,最好通过从构造函数中删除该功能并简单地拥有一个“Attach()”成员函数并在那里处理它来更好地处理。但是,我想确保我朝着正确的方向前进,因为在构造函数中似乎应该有一种方法可以做到这一点。

4

2 回答 2

3

您可以尝试将其从孩子注入到父母,如下所示:

abstract class Game {
   protected GamePiece _piece;

   protected Game(GamePiece piece)
   {
       _piece = piece;
      // do the common work with pieces here
   }
}

class Checkers : Game 
{
   public Checkers(Checker piece) : base(piece)
   {
     // piece-specific work here
   }
}

如果您需要完成比实例化更复杂的工作,您可以创建一个静态工厂方法来完成所有工作,并在调用基本构造函数时调用它。这确实会Game稍微改变您的实现,从而改变您实例化它的方式,但这可以通过在任何需要新的Game.


编辑:我实际上意识到我发布的原始代码示例不正确;没有办法Checker在课堂上引用这件作品(作为检查者)Checkers。但是,如果您也将其注入其中Checker,那么问题就解决了,并且您有了参考。顺便说一下,这是依赖注入

于 2011-09-20T14:24:09.780 回答
2

您可以尝试模板设计模式:

class Game
{
    Game() { Init(); }
    protected virtual void Init() {}
}

现在您可以在 Game Init 方法中插入通用事件处理,并在后代中使用具体的处理逻辑覆盖它。

于 2011-09-20T14:11:54.060 回答