[英]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.