namespace
ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
BClass b = new BClass();
((AClass)b).Output();
b.Output();
((IA)b).Output();
Console.ReadLine();
}
}
public interface IA
{
void Output();
}
public abstract class AClass : IA
{
public AClass()
{
Console.WriteLine("AClass");
}
public virtual void Output()
{
Console.WriteLine("AClass Output");
}
IA Members#region IA Members
void IA.Output()
{
Console.WriteLine("AClass Output Exlicitly");
}
#endregion
}
public class BClass : AClass
{
public BClass()
{
Console.WriteLine("BClass");
}
public new void Output()
{
Console.WriteLine("BClass Output");
}
}
}
输出为:
{
class Program
{
static void Main(string[] args)
{
BClass b = new BClass();
((AClass)b).Output();
b.Output();
((IA)b).Output();
Console.ReadLine();
}
}
public interface IA
{
void Output();
}
public abstract class AClass : IA
{
public AClass()
{
Console.WriteLine("AClass");
}
public virtual void Output()
{
Console.WriteLine("AClass Output");
}
IA Members#region IA Members
void IA.Output()
{
Console.WriteLine("AClass Output Exlicitly");
}
#endregion
}
public class BClass : AClass
{
public BClass()
{
Console.WriteLine("BClass");
}
public new void Output()
{
Console.WriteLine("BClass Output");
}
}
}
AClass...
BClass...
AClass Output...
BClass Output...
AClass Output Exlicitly...
将代码中的new 替换为override,则输出变为:
AClass...
BClass...
BClass Output...
BClass Output...
AClass Output Exlicitly...
从以上代码我们可以看出:
new 作为修饰符时,其作用是隐藏从基类继承过来的方法,注意,仅仅是隐藏,这就意味着我们还是有办法调用到被隐藏的那个方法。而要调用被隐藏的那个方法,实现办法和要调用显示实现的接口方法一样。
而如果用override时,就会重写从基类继承过来的方法,那么,就怎么也调用不到基类的那个方法了。