2017-06-09 69 views
-6

我想知道理論上這個代碼的輸出是什麼? 基本上我覆蓋子類中的方法,但我在父類中調用了 方法。我希望這個輸出是"Child"從父類調用覆蓋的子方法?

pubic class Animal 
    { 
     protected virtual void Activate() 
     { 
     Debug.Log("Parent"); 
     } 

     void CallStuff() 
     { 
     Activate(); 
     } 
    } 

    public class Frog : Animal 
    { 
     override void Activate() 
     { 
      Debug.Log("Child"); 
     } 
    } 

如果我有一隻青蛙實例frog和調用。 。 。

frog.CallStuff(); 

輸出是什麼?

+2

這沒有什麼理論。你試過了嗎? –

回答

0

也許一些例子會解釋最好:

讓我們先從一個基類:

public class Parent { 
    public virtual string WhatAmI() { 
    return "Parent"; 
    } 

    public string Output() { 
    return this.WhatAmI(); 
    } 
} 

調用輸出方法,當然,給你 「父」

new Parent().Output(); // "Parent" 

現在,讓我們重寫虛方法

public class OverridingChild : Parent { 
    public override string WhatAmI() { 
    return "Child"; 
} 

現在當你調用輸出(),它返回「孩子」

new OverridingChild().Output(); // "Child" 

而且如果你將它轉換爲一個家長,你會得到相同的結果:

((Parent) new OverridingChild()).Output(); // "Child" 

如果你想在基類的價值,必須從繼承類中調用基:

public class OverridingChild : Parent { 
    public override string WhatAmI() { 
    return "Child"; 

    public string OutputBase() { 
    return base.WhatAmI(); 
    } 
} 

new OverridingChild().OutputBase(); // "Parent" 

現在的混亂位 - 這裏是你如何能得到任何一個值,這取決於編譯器認爲什麼類的對象是:

public class NewMethodChild : Parent { 
    // note that "new" keyword 
    public new string WhatAmI() { 
    return "Child"; 
} 

直接調用時,編譯器認爲它的繼承類獲取方法您預期的結果:

new NewMethodChild().WhatAmI(); // "Child" 

但如果你將它轉換爲基類,你會得到家長的結果:

((Parent) new NewMethodChild()).WhatAmI(); // "Parent" 

如果你調用的輸出方法,因爲它是在父類中定義它不會看到繼承類的新WhatAmI方法,所以它也輸出基準值:

new NewMethodChild().Output(); // "Parent" 

。希望清除一切。

1

輸出將是「兒童」它繼承了贈品的功能,但推翻了激活功能,所以你會得到孩子

+0

好吧謝謝,順便說一句,我不知道爲什麼這是如此多的倒票這是一個合法的問題。 – user3312266

+3

我放棄了一個,因爲這個問題根本沒有任何理論。你可以自己嘗試一下,看看結果。 –

+3

@ user3312266因爲這是一個非常具有介紹性的問題,您可以通過運行您在問題中發佈的代碼來發現問題,因此它正在降低成本。 –