2011-09-24 119 views
0

可能重复:
why do we need the new keyword and why is the default behavior to hide and not override?父类和子类中的方法名称相同吗?

我有一个家长和一个子类。两者都有一个名称相同的方法,编译器允许它。我无法理解它。为什么编译器没有在子类中显示错误,如果父类具有相同名称的方法。我没有使用新的虚拟或覆盖方法。请帮助我理解为什么编译器没有在子类中显示错误?

class BaseClass 
{ 
    public virtual string SayHi() 
    { 
     return ("Hi"); 
    } 
} 

class DerivedClass : BaseClass 
{ 
    public override string SayHi() 
    { 
     return (base.SayHi() + " from derived"); 
    } 
} 

如果基本方法不是虚拟的,你会真正得到一个编译器警告信息,告诉声明:

class BaseClass 
{ 

    public string SayHi() 
    { 

     return ("Hi"); 

    } 

} 

class DerivedClass : BaseClass 
{ 

    public string SayHi() 
    { 

     return (base.SayHi() + " from derived"); 

    } 

} 
+1

很确定您会收到警告。 – CodesInChaos

回答

6

,如果你想override它的一个子类的基方法必须声明为virtual你说你试图隐藏这个基本方法。如果这是你的意图,你需要使用new关键字:

class BaseClass 
{ 
    public string SayHi() 
    { 
     return ("Hi"); 
    } 
} 

class DerivedClass : BaseClass 
{ 
    public new string SayHi() 
    { 
     return (base.SayHi() + " from derived"); 
    } 
} 

UPDATE:

为了更好地看到区别两者之间来看看下面的例子。

使用碱虚拟方法的第一个,其在子类重写:

class BaseClass 
{ 
    public virtual string SayHi() 
    { 
     return ("Hi"); 
    } 
} 

class DerivedClass : BaseClass 
{ 
    public override string SayHi() 
    { 
     return (base.SayHi() + " from derived"); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     BaseClass d = new DerivedClass(); 
     // the child SayHi method is invoked 
     Console.WriteLine(d.SayHi()); // prints "Hi from derived" 
    } 
} 

第二隐藏底座方法:

class BaseClass 
{ 
    public string SayHi() 
    { 
     return ("Hi"); 
    } 
} 

class DerivedClass : BaseClass 
{ 
    public new string SayHi() 
    { 
     return (base.SayHi() + " from derived"); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     BaseClass d = new DerivedClass(); 
     // the base SayHi method is invoked => no polymorphism 
     Console.WriteLine(d.SayHi()); // prints "Hi" 
    } 
} 
+0

他知道,他问为什么它不会导致编译器错误 –

+0

@Tom Knapen,它会导致编译器警告。没有必要导致错误。 –

+0

这个解释完全描述了这些问题。 OP没有提到看到警告。 – Mark

0

由于该方法不是虚拟的,有没有问题要具有相同的名称。 哪一个被调用仅取决于参考的类型。

BaseClass o = new DerivedClass(); 
o. SayHi(); 

将返回“嗨”。

如果声明父方法virtual,那么您必须在子类中使用override或使其成为new(这是默认值)。 如果你重写它,上面的代码将返回“Hi from derived”。 如果你使它new与它不是虚拟的相同。

+0

lvanov谢谢,你可以指导什么将不同的方法重写和做我做了什么?我得到的是两种方式父类方法将会消失? – haansi

相关问题