我正在学习俄罗斯方块教程,作者创建了一个抽象块类。
块
using System.Collections.Generic;
public abstract class Block
{
protected abstract Position[][] Tiles { get; }
protected abstract Position StartOffset { get; }
public abstract int Id { get; }
private int rotationState;
private Position offset;
public Block()
{
offset = new Position(StartOffset.Row, StartOffset.Column);
}
}
然后生成每个“俄罗斯方块”不同的类将继承抽象类,类似于以下内容:
Z-BLOCK
public class ZBlock : Block
{
private readonly Position[][] tiles = new Position[][]
{
new Position[] { new(1,0), new(1,1), new(1,2), new(1,3) },
new Position[] { new(0,2), new(1,2), new(2,2), new(3,2) },
new Position[] { new(2,0), new(2,1), new(2,2), new(2,3) },
new Position[] { new(0,1), new(1,1), new(2,1), new(3,1) }
};
public override int Id => 1;
protected override Position StartOffset => new Position(-1, 3);
protected override Position[][] Tiles => tiles;
}
来源:https://www.youtube.com/watch?v=jcUctrLC-7M
我认为用构造函数中的“init”初始化它们是一个更好的主意,所以我将代码更改为:
块
internal abstract class Block
{
// Properties
protected Position[][]? Tiles { get; init; }
protected Position? StartOffset { get; init; }
protected int Id { get; init; }
protected Position? Offset { get; set; }
}
Z-BLOCK
internal class BlockZ : Block
{
public BlockZ() : base()
{
// Being Position Jagged Array
Tiles = new Position[][]
{
new Position[] { new(0, 0), new(0, 1), new(1, 1), new(1, 2) },
new Position[] { new(0, 2), new(1, 1), new(1, 2), new(2, 1) },
new Position[] { new(1, 0), new(1, 1), new(2, 1), new(2, 2) },
new Position[] { new(0, 1), new(1, 0), new(1, 1), new(2, 0) },
};
// Define Initial Position for Apperance
StartOffset = new Position(0, 3);
// Define ID of the Block
Id = 7;
// Start Offset For Placement
Offset = new Position(StartOffset.Row, StartOffset.Column);
}
}
是否有任何一种方法比另一种更好?最后在创建 Z-Block 实例时不会传递任何参数,所以我很好奇哪个是最佳实践
谢谢!
override
方法在哲学上和效率方面都是优越的。
从哲学上讲,这些几何学是各个类本身固有的。在构造函数中初始化它们没有多大意义,因为正如您所说,没有传入的参数会影响值。
还有效率方面的考虑。在构造函数中设置这些值意味着为每个类实例创建数组。然而,因为它们永远不会改变,所以这是不必要的。但请注意,出于同样的原因,
tiles
支持字段应该是 static
才能实现这种效率。假设它不会在实例之间发生变化,则无需多次创建此数组。