我正在创建一个国际象棋游戏,我已经创建了车和象的棋子,我即将开始创建皇后棋子。问题是皇后结合了车和象的 Action ,所以我不想编写重复的代码,而只是使用车和象的两个类,它们是皇后类的方法。
这是主教类
public class OficerPiece : Figure
{
public OficerPiece(FigureDefinition definition) : base(definition)
{
}
protected override List<Tuple<int, int>> GetValidTurns()
{
//here i set the valid moves
}
}
rook 类基本相同,但 GetValidTurns() 的实现不同
我的项目中的每个部分都继承了 Figure
抽象类,其中包含每个部分正在使用的信息,唯一的区别在于 GetValidTurns
方法,因此我们将其留给要实现的派生类。
这就是女王级
public class Kralica : Figure
{
public Kralica(FigureDefinition definition) : base(definition)
{
}
protected override List<Tuple<int, int>> GetValidTurns()
{
//here i want to combine the 2 methods GetValidTurns from the bishop class and the rook class
}
}
最佳答案
你也许可以用不同的方式来看待这个问题。
有一个定义移动的抽象基类:
public abstract class Move
{
// Whatever
}
然后从中得出不同的 Action ,例如:
public sealed class Diagonal : Move // Bishop, Queen
{
}
public sealed class Orthongonal : Move // Rook, Queen
{
}
public sealed class KnightsMove : Move
{
}
public sealed class KingsMove : Move
{
}
然后您可以使用组合来组合不同的 Action :
public class Kralica : Figure
{
public Kralica(FigureDefinition definition) : base(definition)
{
}
protected override List<Move> GetValidTurns()
{
return moves;
}
readonly List<Move> moves = new List<Move> {new Diagonal(), new Orthongonal()};
}
您的 Move
类可能声明如下:
public abstract class Move
{
public abstract IEnumerable<Position> PossibleMoves(Position start, Board board);
}
其中 Position
是另一个类,定义为保存有关棋盘上位置的信息(可能就像 X、Y 坐标一样简单),而 Board
是一个类包含有关棋盘上所有棋子位置的信息。
然后,PossibleMoves()
的实现将返回该类型从给定位置开始且棋盘处于给定状态的所有可能移动的枚举。
关于c# - 如何组合从 1 个基派生的 2 个类的 2 个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36821908/