繁体   English   中英

您可以更改创建的用户的默认值 class c#

[英]Can you change the default value for a user created class c#

我正在制作游戏,背景由 Tile 对象组成。 Tile parent 是抽象的,但我有 Tile arrays 来容纳孩子。 当我创建一个 Tile 数组时,我希望它假定 Tile 数组中任何未指定的 object 都是 BlankTile(x, y),其中 x 和 y 是数组中的 position。

abstract class Tile 
{
   Point position;
   public Tile(int x, int y){position = new Point(x, y);}
}

public class BlankTile : Tile
{
   public BlankTile(int x, int y) : base(x, y)
    {position = new Point(x, y);}
}
Tile[] tiles = new Tile[5];

foreach(Tile aTile in tiles)
{
   Console.WriteLine(aTile.GetType().ToString());
}
//output:
//BlankTile
//BlankTile
//BlankTile
//BlankTile
//BlankTile

(如果这是不可能的,或者关于这个或循环更简单的 go 的不正确方法,请告诉我,请告诉我更好的方法)

好问题,但根据 C# 设计,class 的默认值为null

当您初始化任何 class 类型的数组时,例如new Tile[10] ,它就像将default(Tile)分配给每个元素。 deault关键字为类(包括string )返回null ,为内部数字类型和enum返回0 ,为结构返回默认构造函数。

但是您可以使用Enumerable.Repeat(item,count)创建一个填充特定值的数组

public abstract class Tile
{
    public static readonly BlankTile Origin = new BlankTile(0, 0);

    protected Tile(Point position)
    {
        Position = position;
    }

    public Point Position { get; }
}

public class BlankTile : Tile
{
    public BlankTile(int x, int y)
        : base(new Point(x, y))
    {  }        
}

class Program
{
    static void Main(string[] args)
    {
        Tile[] array = Enumerable.Repeat<Tile>(Tile.Origin, 100).ToArray();
    }
}

您可以通过多种方式实现这一目标:

  • 您可以在代码null值视为BlankTile 这会为您节省一些不必要的初始化,但您需要在任何地方都这样做,这不是很方便,而且也容易出错。

  • 您可以创建一个Tiles class 并在构造函数中更改包含数组的初始化。 如果您愿意,可以提供索引器属性来模拟数组访问语法。

  • 您可以创建一个帮助程序 function Tile[] CreateTileArray(int numTiles)而不是使用new []语法,这也可以使用BlankTile s 初始化成员。 不过,无论何时创建 Tile 数组,都需要记住调用此助手 function。

  • 您可以使用带有TileType枚举的单个结构,而不是多个类,并且可以将其初始化为TileType.Blank作为默认值。 编写处理这种布局的代码通常涉及许多检查,因此可能不如使用虚拟方法的单独类那样高效,具体取决于您将拥有多少类型的图块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM