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吗?”)当然,游戏应该是抽象的