在c#中通过子类创建特定的类实例

本文关键字:实例 创建 子类 | 更新日期: 2023-09-27 18:11:58

我将使用我的特定用例来描述我的问题,但考虑到可能有其他应用程序希望基于某些默认值创建子类,它应该更广泛地适用。这不是一个"帮我做作业"的问题。

我目前正在制作一款简单的《俄罗斯方块》游戏,我将游戏场地定义为一个充满方块的二维数组。我在类Grid中这样做,以添加函数并拆分代码。我开发了一个功能,可以让我检查是否可以在某个位置添加另一个网格,以检查是否可以移动到某个位置。(不是一个位置上的两个bool都为true)

由于tetrominos(也是一个网格)具有预定义的形状和大小,因此只需要创建每个形状一次,然后我可以将当前的下降块设置为预定义的tetromino的副本,以便按照我的愿望进行操作。

现在我知道两种方法初始化这些预定义的形状:开始在主要的俄罗斯方块类在一个我称之为一个网格的initialiser(列,行)为每个tetromino一旦和手动设置正确的坐标为true,或者创建一个网格中的构造函数的类需要一个char (tetromino名称L, J,年代,Z, T, X, I)和初始化3 x3或4 x4网格使用另一个构造函数,我已经建立,然后再次手动设置正确的坐标为true。

这两种方法都给这些类增加了混乱,感觉很难看。我希望可以使用子类,因为从技术上讲,tetriminos是特定类型的网格

现在子类中的构造函数只能传递默认参数或给子类构造函数的参数,如下所示:

class Grid
{
    bool[,] grid;
    public Grid(int x, int y)
    {
        // Creates grid, fills it with bools.
    }
}
class Block : Grid
{
    public Block(char blockShape, int x, int y) : base(x, y)
    {
        // Add additional logic here.
    }
}

现在这需要我传递四重奏的尺寸,考虑到这将是预设的,这感觉很奇怪。我更喜欢这样的内容:

class Block : Grid
{
    public Block(string blockShape)
    {
        if ("IX".Contains(blockShape))
        {
            this = new Grid(4, 4);
            // Add additional logic here.
        }
        if ("JLSZT".Contains(blockShape))
        {
            this = new Grid(3, 3);
            // Add additional logic here.
        }
    }
}

有可能这样做吗?如果可以,怎么做呢?如果没有,是否有一个干净的替代解决方案,不会打乱我的网格或俄罗斯方块类?我应该做点别的吗?

在c#中通过子类创建特定的类实例

我只使用静态只读字段。Tetrominos是不可变的,您只需要初始化它们一次,并且可以随意重用它们。

另外,我不太相信tetrominos是从Grid衍生出来的。对我来说,它们在概念上是非常不同的东西;前者是预设不变的块,后者是动态变化的赛场。我不会把这两个元素混为一谈。我将创建一个特定的Tetromino类:

public class Tetromino
{
    public static readonly Tetromino J = new Tetromino(new[,] { { false, false, true }, .... });
    public static readonly Tetromino L = new Terromino(new[,] { { true, false, false } .... });
    //and so on...
    private readonly bool[,] grid;
    private Tetromino(bool[,] shape) //disallow any other Terronimos from being built.
    {
         this.shape = shape;
         Width = shape.GetLength(0);
         Height = shape.GetLength(1);
    }
    public int Height { get; }
    public int Width { get; }
    public bool this[int row, int col] => shape[row, col];
}

现在在你的TetrisGrid类中,你可以使用Tetromino,而不用关心它们的形状。要生成一个特定的,你只需使用相应的字段;myPlayingGrid.Add(Tetromino.J)