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