我遇到了一個我正在製作的遊戲的問題。 基本上我有很多領域,基本類型和其他類型。 從邏輯上講,我製作了基本字段的衍生物,以根據需要添加額外的功能。C#沒有運行派生類函數
但是,似乎當我調用基類中存在的函數時,該函數將從基類而不是派生類運行。
這裏有一些縮減的代碼,所以你可以看到我的意思。
public class Field
{
public Field(Field exitN, Field exitE, Field exitS, Field exitW, bool barricadeAllowed, int returnTo, int xPos, int yPos)
{
//Actual logic is in the constructor, but unrelated to the below function
}
public void Function()
{
if (this is StartField)
{
Debug.WriteLine("StartField running base function!");
}
//Actual logic here.
}
}
。
class StartField : Field
{
public StartField(Field exitN, Field exitE, Field exitS, Field exitW, string color, int xPos, int yPos)
: base(exitN, exitE, exitS, exitW, false, 0, xPos, yPos)
{
//Again, constructor emptied due to unrelatedness.
}
public new void Function()
{
Debug.WriteLine("StartField function");
//Different logic then the base function
}
在startfield對象上調用此函數會導致「startfield運行基本函數!」出現在我的調試欄中,但不是「startfield函數」 這告訴我只有基本函數被調用,即使對象知道它是StartField類型。
如果有差別,所有字段都通過與其他字段的鏈接保存。變量要求類型Field,但所有變量都允許(因爲繼承) 這可以以任何方式使調用轉到「字段」代碼,而不是「StartField」代碼(或任何其他非代碼標準的現場,因爲這似乎是所有場的情況下)
有2個解決方法我能想到的 第一個解決方法我能想到的是檢查的種類和鑄造領域它運行函數之前的實際類型。 但我們不允許在作業中使用(班級是Field)。此外,它需要更多的代碼,然後需要一個簡單的函數調用。
第二個解決方法還使用(類是Field)功能,即將所有字段類型功能編程到基類中。 它不僅使用(類是Field),而且只是感覺明顯錯誤(孩子應該有自己的功能,如果基地擁有所有功能,這是沒有意義的。也可以使用單個類並且類型爲a變量,而不是一個繼承部件)
你爲什麼要在基類中檢查實例?在StarField類上覆蓋函數,並將所有關於StarField類的邏輯放在那裏。 – 2013-04-08 22:05:20
你如何調用'Function'?運行'(新的StartField).Function()'應該按預期工作。 – 2013-04-08 22:06:18