2016-12-05 30 views
0
class Baseclass 
{ 
    public void fun() 
    { 
     Console.Write("Base class" + " "); 
    } 
} 
class Derived1 : Baseclass 
{ 
    new void fun() 
    { 
     Console.Write("Derived1 class" + " "); 
    } 
} 
class Derived2 : Derived1 
{ 
    new void fun() 
    { 
     Console.Write("Derived2 class" + " "); 
    } 
} 
class Program 
{ 
    public static void Main(string[] args) 
    { 
     Derived2 d = new Derived2(); 

     Derived1 e = new Derived1(); 
     d.fun(); 
     e.fun(); 
    } 
} 

如何訪問結果在衍生1和衍生2,而不是基類 這是超載或重載?我如何訪問結果導出1和衍生2,而不是基類

+1

使用*基類方法中的virtual *關鍵字,以及派生類中的* override *。順便說一句,沒有結果訪問一個無效的方法 –

+0

什麼@SirRufo說,正是你所需要的。只是爲了增加一些價值,爲什麼你使用'新'鍵盤? –

回答

0

new既不重載也不重寫。它基本上說'當我被叫,和對象被鑄造爲Derived1,然後調用此'。請注意,當對象被投入時,而不是每當對象進行交互時,它就是

如果您已將方法標記爲public,那麼您的代碼將出現即可使用。例如:

class Derived1 : Baseclass 
{ 
    public new void fun() 
    { 
     Console.Write("Derived1 class" + " "); 
    } 
} 
class Derived2 : Derived1 
{ 
    public new void fun() 
    { 
     Console.Write("Derived2 class" + " "); 
    } 
} 

將打印

Derived2的類Derived1類

然而,改變你的代碼下面將在這種情況下,與new揭示問題:

void Main() 
{ 
    Derived2 d = new Derived2(); 

    Derived1 e = new Derived1(); 
    ExecuteIt(d); 
    ExecuteIt(e); 
} 

void ExecuteIt(Baseclass obj) 
{ 
    obj.fun(); 
} 

打印

基類基類

由於對象被鑄造成Baseclass,並且因此隱藏不生效。要正確實現壓倒一切,你需要做到以下幾點:

class Baseclass 
{ 
    public virtual void fun() 
    //  ^^^^^^^ 
    { 
     Console.Write("Base class" + " "); 
    } 
} 
class Derived1 : Baseclass 
{ 
    public override void fun() 
// ^^^^^^ ^^^^^^^^ 
    { 
     Console.Write("Derived1 class" + " "); 
    } 
} 
class Derived2 : Derived1 
{ 
    public override void fun() 
// ^^^^^^ ^^^^^^^^ 
    { 
     Console.Write("Derived2 class" + " "); 
    } 
} 

,當與運行:

void Main() 
{ 
    Derived2 d = new Derived2(); 

    Derived1 e = new Derived1(); 
    ExecuteIt(d); 
    ExecuteIt(e); 
} 

void ExecuteIt(Baseclass obj) 
{ 
    obj.fun(); 
} 

正確輸出

Derived2的類Derived1類

+0

謝謝,我想通了..我有問題,虛擬和覆蓋關鍵字是合作伙伴嗎?抽象和覆蓋關鍵字也是合作伙伴? –

+0

可以在覆蓋方法和虛擬中使用相同的過程。例如,虛擬說是,覆蓋說不,或虛擬說不,否則覆蓋不說太 –

+0

@JohnMasqued我不知道合作伙伴是正確的詞,但是 - 你只能覆蓋抽象或虛擬成員。我不確定你的第二條評論是什麼意思,但如果你問是否有可能獲得父結果,那麼是的:你會調用'base.fun()' – Rob

相關問題