2017-08-30 65 views
0

我有以下類別:如何才能獲得新的關鍵字定義的方法在派生類中

class SearchEngine 
{ 
    public virtual void Search() 
    { 
     Console.WriteLine("Base Class"); 
    } 
} 

class Google: SearchEngine 
{ 
    public override void Search() 
    { 
     Console.WriteLine("Google Class"); 
    } 
} 

class Yahoo: SearchEngine 
{ 
    public new void Search() 
    { 
     Console.WriteLine("new method in Yahoo Class"); 
    } 
} 

,我打電話給他們這樣說:

SearchEngine s1 = new SearchEngine(); 
SearchEngine s2 = new Google(); 
SearchEngine s3 = new Yahoo(); 

s1.Search(); 
s2.Search(); 
s3.Search(); 

我得到下面的結果:

Base Class 
Google Class 
Base Class 

我的問題是如何從Yahoo類訪問Search()方法? (是的,我知道這是一個壞主意,用new關鍵字這樣的,我知道這不是壓倒一切的類)

+4

「是的,我知道這是不好的主意,使用這樣的新關鍵字,我知道這不是壓倒一個類」。比你爲什麼要做呢?除非你省略'new'或使用'Google s1 = new Google();'或'Yahoo s2 = new Yahoo();'或'只有在將您的實例轉換爲派生類時,'new'關鍵字才起作用。將它轉化爲基類導致調用基方法。 – HimBromBeere

+0

答案是「在'Yahoo.Search()'上使用'override'而不是'new'。對」不,認真,我怎麼做錯了「的回答就是這樣的Lovecraftian噩夢:'public static空隙搜索(的搜索引擎ENG) { 如果(ENG是雅虎) (ENG雅虎).Search(); 否則 eng.Search();} '' –

回答

3

要做到這一點,你需要改變:

SearchEngine s3 = new Yahoo(); 

到:

var s3 = new Yahoo(); 

或:

Yahoo s3 = new Yahoo(); 

new方法不能從基類「訪問」。當在方法上指定時,這是整點new

+0

dynamic'也可以使用,但上述 – mjwills

+0

要添加上面的答案,可以使用以下代碼訪問基類方法:'((SearchEngine)s3).Search();' –

相關問題