在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.
}
}
}
有可能这样做吗?如果可以,怎么做呢?如果没有,是否有一个干净的替代解决方案,不会打乱我的网格或俄罗斯方块类?我应该做点别的吗?
我只使用静态只读字段。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];
}
现在在你的Tetris
或Grid
类中,你可以使用Tetromino
,而不用关心它们的形状。要生成一个特定的,你只需使用相应的字段;myPlayingGrid.Add(Tetromino.J)