Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中处理指定的成员类#_C#_Members_Derived Instances - Fatal编程技术网

C# 在C中处理指定的成员类#

C# 在C中处理指定的成员类#,c#,members,derived-instances,C#,Members,Derived Instances,在构建类结构时,我希望派生类可能拥有派生成员类。例如: class GamePiece { } class Checker : GamePiece {} class ChessMan : GamePiece {} class Game { protected GamePiece _piece; } class Checkers : Game { Checkers(){ _piece = new Checker(); } } class Chess : Game { Ch

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

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()”成员函数并在那里处理它,就可以更好地处理这个问题。但是,我想确保我走的方向是正确的,因为在构造函数中似乎应该有一种方法来实现这一点

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

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

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

您可以尝试将它从子代注入到父代,如下所示:

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
   }
}
如果您需要完成比实例化更复杂的工作,那么可以创建一个完成所有工作的静态工厂方法,并在调用基本构造函数时调用该方法。这确实会稍微改变
游戏
的实现方式,从而改变实例化它的方式,但这可以通过在需要新
游戏
的任何地方使用factory对象来解决



编辑:我实际上意识到我发布的原始代码示例不正确;无法在
Checkers
类中引用
检查器
工件(作为检查器)。但是,如果您将
检查器
片段也注入其中,问题就解决了,您就有了参考。顺便说一下,

也考虑使用抽象基类。我通常避免在构造函数中调用<代码>虚拟< /代码>方法。很难确切地知道什么时候可以完成。<代码> > init < /Cult>被调用。很难对对象的状态进行推理(“我可以使用属性x吗?”)当然,游戏应该是抽象的