簡體   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