我將使用我的具體用例來描述我的問題,但考慮到可能有其他應用程序想要根據某些默認值創建子類,它應該更廣泛適用。這並不意味着成爲「爲我做作業」的問題。通過C#中的子類創建特定的類實例
我目前正在研究一個簡單的俄羅斯方塊遊戲,我已經將我的遊戲場定義爲一個填充了bools的二維數組。我在一個類的Grid中添加了函數並分離了我的代碼。我開發了一個函數,讓我檢查是否可以在某個位置添加另一個Grid,以檢查Tetromino是否可以移動到某個位置。 (不是兩個bools在一個位置上都是如此)
由於tetrominos(也是網格)具有預定義的形狀和大小,因此只需創建一次每個形狀,然後我可以將當前的下降塊設置爲那個預定義的tetromino可以按照我的意願操作。
現在我知道了初始化這些預定義形狀的兩種方法:在初始化程序中的Tetris主類中啓動它們,其中我爲每個tetromino調用一次Grid(Columns,Rows)並手動將正確的座標設置爲true,或者在Grid類中創建第二個構造函數,該構造函數接受char(tetromino名稱L,J,S,Z,T,X,I),並使用我已經構建的其他構造函數初始化3x3或4x4網格,然後手動設置正確的座標再次爲真。
這兩種方法都給這些感覺難看的類增加了混亂。我希望有可能使用一個子類,從技術上考慮tetriminos是特定類型的網格。
現在在子類只要我能找到也只能通過對被給予該子類的構造函數,像這樣的默認參數或參數的構造函數:
class Grid
{
bool[,] grid;
public Grid(int x, int y)
{
// Creates grid, fills it with bools.
}
}
class Block : Grid
{
public Block(char blockShape, int x, int y) : base(x, y)
{
// Add additional logic here.
}
}
現在,這需要我傳球在tetromino的尺寸,這感覺很奇怪,因爲這將被預先設定。我更希望是沿着這些路線的東西:
class Block : Grid
{
public Block(string blockShape)
{
if ("IX".Contains(blockShape))
{
this = new Grid(4, 4);
// Add additional logic here.
}
if ("JLSZT".Contains(blockShape))
{
this = new Grid(3, 3);
// Add additional logic here.
}
}
}
是沿着這些線路可能的東西嗎?如果是這樣,那該怎麼辦?如果沒有,是否有一個乾淨的替代解決方案,不會混亂我的Grid或Tetris類?我應該做其他事嗎?
Tetrominos - 哇,這是一個字! –