2017-08-30 31 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();' –

相关问题