我正在制作一個游戲,背景是由 Tile 物件組成的。Tile 父級是抽象的,但我有 Tile 陣列來保存子級。當我創建一個 Tile 陣列時,我希望它假設 Tile 陣列中的任何未指定物件都是 BlankTile(x, y) 其中 x 和 y 是陣列中的位置。
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
(如果這是不可能的或不正確的方法或回圈更簡單,請告訴我并告訴我更好的方法)
uj5u.com熱心網友回復:
有很多方法可以實作這一點:
您可以在代碼中將
null值視為BlankTiles。這會為你節省一些不必要的初始化,但你需要在任何地方都這樣做,這不是很方便,而且還容易出錯。您可以創建一個
Tiles類并在建構式中更改包含陣列的初始化。如果您愿意,可以提供一個索引器屬性來模擬陣列訪問語法。您可以創建一個輔助函式
Tile[] CreateTileArray(int numTiles)而不是使用new []語法,它也可以用BlankTiles 初始化成員。不過,您需要記住在創建 Tile 陣列時呼叫此輔助函式。您可以使用帶有
TileType列舉的單個結構而不是多個類,并且可以將其初始化TileType.Blank為默認值。撰寫處理這種布局的代碼通常涉及許多檢查,因此可能不如具有虛擬方法的單獨類那樣高效,具體取決于您將擁有多少型別的圖塊。
uj5u.com熱心網友回復:
好問題,但根據 C# 設計,類的默認值為null.
當您初始化任何型別別的陣列時,new Tile[10]就像分配default(Tile)給每個元素一樣。deault關鍵字回傳null類(包括string)、0內在數字型別和結構的enum默認建構式。
但是您可以使用以下方法創建一個填充有特定值的陣列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();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/512802.html
標籤:C#数组。网班级目的
上一篇:Powershell:從同一個物件中參考另一個物件屬性中的物件屬性?
下一篇:從物件陣列中提取元素值
