簡體   English   中英

C#未運行派生類函數

[英]C# not running derived class function

我正在制作的游戲有問題。 基本上,我有很多字段,基本類型和其他類型。 從邏輯上講,我對基本字段進行了派生,以根據需要添加其他功能。

但是,似乎當我調用基類中存在的函數時,該函數將從基類而不是派生類中運行。

這是一些簡化代碼,因此您可以了解我的意思。

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,但是所有變量都允許(因為繼承),這可以通過任何方式導致調用轉到“ Field”代碼,而不是“ StartField”代碼(或任何其他非標准代碼)字段,因為似乎所有字段都是這種情況)

我可以想到兩種解決方法。我想到的第一種解決方法是在運行函數之前檢查類型並將字段強制轉換為實際類型。 但是我們不允許在分配中使用(類是Field)。 另外,與簡單的函數調用相比,它將需要更多的代碼。

第二種解決方法還使用(類是Field)功能,即將所有字段類型的功能編程到基類中。 它不僅使用(類是Field),而且感覺很普通(子級應該有自己的功能,如果基數全部都沒有意義,那么最好只使用一個類並將類型作為變量而不是繼承成員)

基本上,聽起來您需要Function是一個虛擬方法,在StartField對其進行了覆蓋

// In Field
public virtual void Function()
{
    if (this is StartField)
    {
        Debug.WriteLine("StartField running base function!");
    }
    //Actual logic here. 
}

// In StartField
public override void Function()
{
    Debug.WriteLine("StartField function");
    //Different logic then the base function
}

您當前的代碼使用多態性-如果您正在調用Function的表達式的編譯時類型僅為Field ,則它將始終調用Field.Function ,因為它不是虛擬的。 然后,在StartField您明確地說:“我不打算覆蓋基本方法-我提供了一個新方法。”

有關new修飾符 ,請參見MSDN頁面; 有關virtual修飾符的信息,請參見MSDN頁面

如果將Function 虛擬化了怎么辦?

public virtual void Function()
{
    if (this is StartField)
    {
        Debug.WriteLine("StartField running base function!");
    }
    //Actual logic here. 
}

然后在StartField重寫,如下所示:

public override void Function()
{
    Debug.WriteLine("StartField function");
    //Different logic then the base function
}

絕對不要嘗試解決此問題-這是基本的OOP。

您需要將基類方法標記為虛方法(如果沒有自己的邏輯,則標記為抽象),以便可以將其覆蓋。 然后將子類方法標記為重寫。 例如,檢查http://msdn.microsoft.com/en-us/library/ebca9ah3(v=vs.110).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM