C# 为继承的抽象类定义“常量”属性的首选方法

问题描述 投票:0回答:1

我正在学习俄罗斯方块教程,作者创建了一个抽象块类。

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 实例时不会传递任何参数,所以我很好奇哪个是最佳实践

谢谢!

c# inheritance constructor abstract
1个回答
0
投票

override
方法在哲学上和效率方面都是优越的。

从哲学上讲,这些几何学是各个类本身固有的。在构造函数中初始化它们没有多大意义,因为正如您所说,没有传入的参数会影响值。

还有效率方面的考虑。在构造函数中设置这些值意味着为每个类实例创建数组。然而,因为它们永远不会改变,所以这是不必要的。但请注意,出于同样的原因,

tiles
支持字段应该是
static
才能实现这种效率。假设它不会在实例之间发生变化,则无需多次创建此数组。

© www.soinside.com 2019 - 2024. All rights reserved.