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

标签 c# class inheritance abstract chess

我正在创建一个国际象棋游戏,我已经创建了车和象的棋子,我即将开始创建皇后棋子。问题是皇后结合了车和象的 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/

相关文章:

c# - 获取 Entity Framework 中的总行数

java - 如何摆脱继承?

c# - 奇怪的报告查看器错误 : Could not load file or assembly 'App_WebReferences. e8ik1wuc

c# - 简化表达式选择器

c# - ZipArchive 创建无效的 ZIP 文件

ruby - 包含一个模块来定义动态类方法

php - 编写一个类以在 WordPress 中传递 add_action 参数

c++ - 从 QString 到 Class 类型

C++ 继承 - 如何使用指向基类对象的指针访问子方法

java - 在Java中,我可以为非扩展实例创建构造函数吗?