gpt4 book ai didi

c# - 如何组合来自 1 个基派生的 2 个类的 2 个方法?

转载 作者:行者123 更新时间:2023-11-30 21:49:36 27 4
gpt4 key购买 nike

我正在创建一个国际象棋游戏,我已经创建了车和象,我即将开始创建皇后棋子。问题是女王结合了车和主教的 Action ,所以我不想写重复的代码,而是只使用车和主教的 2 个类,它们是女王的方法。

这是主教类

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com